产品目录


17

这个问题是关于将代表产品标识符的字符串分成三个部分。

  • 第一部分由任意长度的上下字母组成,代表仓库。
  • 第二部分是代表产品编号的数字。这部分也是任意长度的。
  • 最后一部分是大小和颜色的限定词,该部分一直持续到字符串的末尾。限定词保证以大写字母开头,并由字母数字字符组成。

每个部分应打印清晰分开。保证每个部分都是非空的。

获胜者是使用最少字节来解决此问题的人。

示例:
输入: UK7898S14

输出:
UK
7898
S14

在这里英国是英国,产品代码是7898,而S14是尺寸14。

示例2:
输入: cphDK1234CYELLOWS14QGOOD

输出:
cphDK
1234
CYELLOWS14QGOOD

这里的cphDK是丹麦的哥本哈根,产品代码是1234,CYELLOWS14QGOOD表示黄色,大小14,质量很好。


2
每个部分都是非空的吗?
Karl Napf '16

@KarlNapf是的。每个部分都是非空的。
Highace2 '16

@Emigna现在已包含一个附加示例。
Highace2 '16

“第一部分由大写和小写字母组成” –也许其中一个示例可能包含大写和小写字母的混合形式。也许还有一个国家代码,长度不超过2个字符。另外,限定词是否可以包含非字母数字字符,例如“ Quality★★★☆☆”?
manatwork 2013年

Answers:


10

Perl,12个字节

11个字节的代码+ 1个字节的-p标志。

s/\d+/
$&
/

运行它:

perl -pe 's/\d+/
$&
/' <<< "CYELLOWS14QGOOD"

2
爱简单!:)
Dom Hastings

4

APL,18

{⍵⊂⍨3⌊+\1,2≠/⍵∊⎕D}'UK7898S14'
UK  7898  S14 

通过搜索从字符到数字或从字符到数字的变化的前两个点,然后使用它们来分割字符串,可以工作。



3

Haskell,36个字节(无正则表达式)

d c='/'<c&&c<':'
(span d<$>).break d

这样以格式给出结果("UK",("7898","S14"))。这个想法是在第一个数字拆分,然后在第一个非数字拆分其余。 在Ideone上尝试一下


在元组上很好地使用fmap。
xnor

3

JavaScript,38 36字节

s=>/(\D+)(\d+)(.+)/.exec(s).slice(1)


@Arnauld很好。
佛罗伦萨


2

Gema,17个12个字符

(不处理国家代码的技巧明显是从Dada的网站无耻地借来的 Perl解决方案中。应该在其中表示赞赏。)

<D>*=\n$1\n*

样品运行:

bash-4.3$ gema '<D>*=\n$1\n*' <<< 'UK7898S14'
UK
7898
S14

bash-4.3$ gema '<D>*=\n$1\n*' <<< 'cphDK1234CYELLOWS14QGOOD'
cphDK
1234
CYELLOWS14QGOOD

2

Python 2,40字节

我对正则表达式了解不多,但是值得庆幸的是,这个问题很简单:)将输入字符串分隔成长度为3的列表,该列表包含每个部分。

import re
lambda k:re.split('(\d+)',k,1)

2

05AB1E39 37 16字节

感谢Emigna节省了很多字节。

它使用CP-1252编码。

TvDSdykF¬?¦}¶?}?

T                push "10"
 v               for each element (i.e., 1 and 0). Element is stored in 'y'
  DS             split string (input during the first iteration)
    d            for each character, 1 if digit or 0 otherwise
     yk          get index of the first occurrence of 'y'
       F         for 0 <= i < string.firstIndexOf(y)
        ¬?       print the first character of the string
          ¦      remove it from the string
           }     end inner for
            ¶?   display a newline
              }  end outer for
               ? display the remaining string

在线尝试!

(这是我第一次发帖!)


通过检查数字而不是字母,您可以节省至少14个字节。而且这可能会打更多。
Emigna '16

另外,欢迎来到PPCG :)
Emigna '16

谢谢!而且您是对的,实际上,我从字面上看从左到右都是幼稚的。我也尝试挖掘.páà¬以获得第一部分,但是乍一看似乎对其余部分没有帮助。
2016年

随时用我的代码更新您的答案(如果可以的话,再打些高尔夫球)。我认为它与众不同足以保证它是自己的答案。
Emigna '16

确定,然后我会做的,因为我找到了一种将其循环的方法。没什么太复杂的,但至少下降到16个字节。再次感谢你!(现在我必须更新解释...但是要解释的字节更少)
2016年

1

JavaScript(ES6),36个字节

s=>/(.+?)(\d+)(.*)/.exec(s).slice(1)

例子


1

Java 7中,200个 185 174 167字节

import java.util.regex.*;String c(String s){Matcher m=Pattern.compile("(.*?)(\\d+)(.*)").matcher(s);s="";for(int i=0;i<3;)if(m.matches())s+=m.group(++i)+" ";return s;}

取消测试代码:

在这里尝试。

import java.util.regex.*;
class M{
  static String c(String s){
    Matcher m = Pattern.compile("(.*?)(\\d+)(.*)").matcher(s);
    s = "";
    for(int i = 0; i < 3;){
      if(m.matches()){
        s += m.group(++i) + " ";
      }
    }
    return s;
  }

  public static void main(String[] a){
    System.out.println(c("UK7898S14"));
    System.out.println(c("cphDK1234CYELLOWS14QGOOD"));
  }
}

输出:

UK 7898 S14 
cphDK 1234 CYELLOWS14QGOOD 

1

C#,191字节

打高尔夫球:

void F(string s){var a=s.ToList();int i=a.FindIndex(char.IsDigit);int n=a.FindIndex(i,char.IsUpper);Console.Write($"{s.Substring(0,i)}\n{s.Substring(i,n-i)}\n{s.Substring(n)}");

取消高尔夫:

    void F(string s)
    {
        var a = s.ToList();
        int i = a.FindIndex(char.IsDigit);
        int n = a.FindIndex(i, char.IsUpper);

        Console.Write($"{s.Substring(0, i)}\n{s.Substring(i, n - i)}\n{s.Substring(n)}");
    }

EDIT1:@Link Ng保存14个字节。


您不需要ToCharArray()。字符串已经是IEnumerable <char>
链接Ng

当然,我不敢相信我没有注意到这一点。
paldir

1

PHP,48字节

print_r(preg_split('/(\D+|\d+)\K/',$argv[1],3));

凭借其$limit参数以及极为有用的功能\Kpreg_split()它非常适合应对这一挑战。


1

MATLAB,81 73字节

function y=f(x)
[~,~,~,m,~,~,s]=regexp(x,'(?<=^\D+)\d+');y=[s(1) m s(2)];

接受字符串并返回包含三个字符串的单元格数组的函数。在版本R20105b中测试。

使用示例:

>> f('UK7898S14')
ans = 
    'UK'    '7898'    'S14'

>> f('cphDK1234CYELLOWS14QGOOD')
ans = 
    'cphDK'    '1234'    'CYELLOWS14QGOOD'

说明

正则表达式 (?<=^\D+)\d+')从字符串的开头匹配一组数字,后跟非数字;后者不属于比赛的一部分。

的第四个输出regexp'match';第七个输出是'split',即匹配前后字符串的两部分。


1

Ruby,28个字节

->s{puts s.sub(/\d+/,"\n\\&\n")}

这用换行符包围第一组数字。


0

jq,47个字符

(43个字符的代码+ 4个字符的命令行选项。)

match("(\\D+)(\\d+)(.+)").captures[].string

(按照旧的故事:一开始相当优雅,然后变得冗长。)

样品运行:

bash-4.3$ jq -Rr 'match("(\\D+)(\\d+)(.+)").captures[].string' <<< 'UK7898S14'
UK
7898
S14

bash-4.3$ jq -Rr 'match("(\\D+)(\\d+)(.+)").captures[].string' <<< 'cphDK1234CYELLOWS14QGOOD'
cphDK
1234
CYELLOWS14QGOOD

在线测试-r不支持通过URL 传递-自己检查Raw Output。)


0

PHP,61 59 56 55字节

preg_match('/(\D+)(\d+)(.+)/',$argv[1],$a);print_r($a);

这也将输出初始代码:

Array
(
    [0] => cphDK1234CYELLOWS14QGOOD
    [1] => cphDK
    [2] => 1234
    [3] => CYELLOWS14QGOOD
)

编辑

感谢@manatwork为我节省了一些字节
感谢@RomanGräf又节省了一些字节


1
[\d]?:o \d足够了。
manatwork 2013年

@manatwork谢谢。我没有使用足够的正则表达式(可以说是一件好事),并且在记起\ d之前开始使用[0-9] +路由
gabe3886 '16

1
为什么不替换[a-z]\D
罗曼·格拉夫(RomanGräf),

1
现在您没有了[a-z]i也不需要该标志。
manatwork

我真的需要花更多的时间来处理正则表达式。
gabe3886 '16

0

不带正则表达式的JavaScript,84 81 79字节

p=>{for(i=n=o='';i<p.length;){if(n==isNaN(c=p[i++])){o+=' ';n++}o+=c}return o}


2
您可以将所有初始化放在一个位置:o=n=i=''
manatwork 2013年

并将分配移至c的第一个用法:isNaN(c=p[i++])
manatwork 2013年

p=>{for(i=n=o=0;i<p.length;){c=p[i++];if(n++==c<59){o+=' '}o+=c}return o}
罗曼·格拉夫(RomanGräf),

@RomanGräf,应保留初始化,''因为将结果连接到的o。但是遗憾的是您的代码对我不起作用,需要有条件地增加n。
manatwork

p=>{for(i=n=0,o='';i<p.length;){c=p[i++];if(n==c<59){o+=' ';n++}o+=c}return o}
罗曼·格拉夫(RomanGräf),

0

Mathematica,39个字节

StringSplit[#,a:DigitCharacter..:>a,2]&

匿名函数。将字符串作为输入,并返回字符串列表作为输出。


0

拍子274字节

(let((g 0)(j'())(k'())(l'())(m list->string)(r reverse)(n char-numeric?)(c cons))(for((i(string->list s)))
(when(and(= g 0)(n i))(set! g 1))(when(and(= g 1)(not(n i)))(set! g 2))(match g[0(set! j(c i j))]
[1(set! k(c i k))][2(set! l(c i l))]))(list(m(r j))(m(r k))(m(r l))))

取消高尔夫:

(define (f s)
  (let ((g 0)
        (j '())
        (k '())
        (l '())
        (m list->string)
        (r reverse)
        (n char-numeric?)
        (c cons))
    (for ((i (string->list s)))
      (when (and (= g 0) (n i)) (set! g 1)  )
      (when (and (= g 1) (not (n i))) (set! g 2) )
      (match g
        [0 (set! j (c i j))]
        [1 (set! k (c i k))]
        [2 (set! l (c i l))]))
    (list (m (r j)) (m (r k)) (m (r l)))))

测试:

(f "UK7898S14")
(f "cphDK1234CYELLOWS14QGOOD")

输出:

'("UK" "7898" "S14")
'("cphDK" "1234" "CYELLOWS14QGOOD")

0

R,63 52字节

编辑:感谢@JDL,节省了一堆字节

从stdin接受输入并打印到stdout:

gsub("([a-z]+)(\\d+)(.+)","\\1 \\2 \\3",scan(,""),T)

输出示例:

[1] "UK 7898 S1"
[1] "cphDK 1234 CYELLOWS14QGOOD"

会不会gsub (...,"\\1 \\2 \\3")更有效率?
JDL

@JDL不确定我是否遵循。想要详细说明还是举一个例子?
Billywob

类似的东西gsub("([A-Za-z]+)([0-9]+)(.+)","\\1 \\2 \\3",scan()),尽管第一个参数可能表示为比这更小的东西……
JDL

@JDL非常聪明,但是我不知道"\\1 \\2 \\3"替换是如何工作的。还稍微更新了正则表达式模式并使用ignore.case = TRUE
Billywob

无论是在第一/第二/第三对捕获他们只是表示“输出()支架。
JDL

0

果冻,14 字节

O<65ITḣ2‘ṬœṗµY

TryItOnline!

怎么样?

O<65ITḣ2‘ṬœṗµY - Main link: productIdentifier   e.g. "UK7898S14"
O              - cast to ordinals               e.g. [85,75,55,56,57,56,83,49,52]
 <65           - less than 65?                  e.g. [ 0, 0, 1, 1, 1, 1, 0, 1, 1]
    I          - incremental difference         e.g. [ 0, 1, 0, 0, 0,-1, 1, 0]
     T         - truthy indexes                 e.g. [2, 6, 7]
      ḣ2       - head to 2                      e.g. [2, 6]
        ‘      - increment                      e.g. [3, 7]
         Ṭ     - set truthy indexes             e.g. [0, 0, 1, 0, 0, 0, 1]
          œṗ   - split y at truthy indexes of x e.g. ["UK", "7898", "S14"]
            µ  - monadic chain separation
             Y - join with line feeds

0

C,107字节

#define p(x) printf("%c",x);
f(char*s){for(;*s>64;s++)p(*s)p(10)for(;*s<58;s++)p(*s)p(10)for(;*s;s++)p(*s)}

致电:

int main()
{
   f("UK7898S14");
   return 0;
}

0

Python 2,103 94 88字节

不使用正则表达式的解决方案

a,b=input(),""
for f in a:
 if ord(f)<58:b+=f
 elif b"":c,d=a.split(b);print c,b,d;break

只需从中间提取数字,然后使用数字作为索引对输入进行切片。在输入中需要使用引号,但是我没有看到禁止使用引号的地方。

-9通过在中间数字上拆分a然后在中间打印带有b的组件

-6感谢@Shebang

测试用例

D:\>python codes.py
"UK7898S14"
UK 7898 S14

D:\>python codes.py
"cphDK1234CYELLOWS14QGOOD"
cphDK 1234 CYELLOWS14QGOOD

b!="" -> b>""c=a.split(b) -> c,d=a.split(b) ... print c[0],b,c[1] -> print c,b,d节省5个字节。
卡德

@Shebang的提示非常好。谢谢
ElPedro

啊,我忘了空字符串是虚假的。您可以通过保存它来节省另外3个字节elif b:;)
Kade

0

C#,74个字节

v=>new System.Text.RegularExpressions.Regex("\\d+").Replace(v,"\n$&\n",1);

像Johan Karlsson为JavaScript所做的那样,将第一组数字替换为回车符,一组数字和另一个回车符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.