제품 카탈로그


17

이 문제는 제품 식별자를 나타내는 문자열을 세 가지 구성 요소로 분리하는 것입니다.

  • 첫 번째 부분은 창고를 나타내는 임의의 길이의 대문자와 소문자로 구성됩니다.
  • 두 번째 부분은 제품 번호를 나타내는 숫자입니다. 이 부분은 또한 임의의 길이입니다.
  • 마지막 부분은 크기와 색상의 한정자이며이 부분은 문자열의 끝까지 계속됩니다. 규정자는 대문자로 시작하고 영숫자로 구성됩니다.

각 부분은 명확하게 분리되어 인쇄되어야합니다. 각 부분이 비어 있지 않은 것이 보장됩니다.

승자는이 문제를 해결하기 위해 최소 바이트를 사용하는 사람입니다.

: 예
입력 : UK7898S14의

출력 :
UK
7898
S14

영국은 영국, 7898은 제품 코드, S14는 14입니다.

예 2 :
입력 : cphDK1234CYELLOWS14QGOOD

출력 :
cphDK
1234
CYELLOWS14QGOOD

여기서 cphDK는 덴마크 코펜하겐이며 1234는 제품 코드이며 CYELLOWS14QGOOD는 노랑, 크기 14, 우수한 품질을 나타냅니다.


2
각 부분이 비어 있지 않습니까?
Karl Napf

@KarlNapf 예. 각 부분은 비어 있지 않습니다.
Highace2

@Emigna 이제 추가 예제가 포함되었습니다.
Highace2

“첫 번째 부분은 대문자와 소문자로 구성되어 있습니다.”– 예 중 하나에 대문자와 소문자가 혼합되어있을 수 있습니다. 또한 2 자 길이가 아닌 국가 코드 일 수도 있습니다. 또한 한정자에 "Quality ★★★ ☆☆"와 같이 영숫자가 아닌 문자가 포함될 수 있습니까?
manatwork

PPCG에 오신 것을 환영합니다!
Outgolfer Erik

답변:


10

펄, 12 바이트

코드의 11 바이트 + -p플래그의 경우 1 바이트

s/\d+/
$&
/

그것을 실행하려면 :

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

2
단순성을 사랑하십시오! :)
Dom Hastings

4

APL, 18

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

문자에서 숫자로 또는 그 반대로 변경되는 처음 두 지점을 검색하고 그 지점을 사용하여 문자열을 분할하여 작동합니다.


4

망막 , 28 14 10 8 바이트

Dom Hastings 덕분에 4 바이트를 절약했습니다 . Martin Ender
덕분에 2 바이트를 절약했습니다 .

S1`(\d+)

온라인으로 사용해보십시오!


@Dada 의 답변과 동일한 메커니즘을 사용하여 retina.tryitonline.net/…(tbh , 아마도 더 많지만 그게 내가 저장할 수있는 전부입니다 !) 와 같은 다른 4 바이트를 저장할 수 있습니다 .
Dom Hastings

@DomHastings. 아아, 교체와 함께 좋은 아이디어!
Emigna

3

Haskell, 36 바이트 (정규식 없음)

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

결과는 형식으로 제공됩니다 ("UK",("7898","S14")). 아이디어는 첫 번째 자리에서 나누고 나머지는 첫 번째 자리가 아닌 자리에서 나누는 것입니다. Ideone에서 사용해보십시오 .


튜플에서 fmap을 잘 사용합니다.
xnor

3

자바 스크립트, 38 36 바이트

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


@Arnauld 잘 잡아라.
Florent

3

자바 스크립트 (ES6), 28 26 바이트

s=>s.replace(/\d+/,`
$&
`)

@Grax 덕분에 2 바이트 절약


대치에서 $ &를 사용하고 괄호를 제거하여 2자를 더 줄일 수 있습니다. s=>s.replace(/\d+/,` $& `)
Grax32

2

Gema, 17 12 자

( DadaPerl 솔루션 에서 명백히 빌려온 국가 코드를 처리하지 않는 트릭 . 감사를 표해야합니다.)

<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

파이썬 2, 40 바이트

나는 많은 정규 표현식을 모르지만 고맙게도이 문제는 충분히 간단합니다. :) 입력 문자열을 각 부분을 포함하는 길이 3의 목록으로 분리합니다.

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

2

05AB1E ,39 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

또한 PPCG에 오신 것을 환영합니다 :)
Emigna

감사! 그리고 당신 말이 맞아요, 사실 저는 왼쪽에서 오른쪽으로 말 그대로 순진합니다. 나는 또한 발굴하려고.páଠ첫 번째 부분을 얻으 나머지 부분을 한눈에 도움이되지 않는 것 같습니다.
Osable

내 코드로 답변을 업데이트하십시오 (가능하면 더 골프를 치십시오). 나는 그것이 자신의 대답을 보증하기에 충분히 다르다고 생각하지 않습니다.
Emigna

좋아, 루프에 넣을 방법을 찾은 다음에 해보겠습니다. 너무 정교하지는 않지만 적어도 16 바이트로 내려갑니다. 다시 감사합니다! (이제 설명을 업데이트해야하지만 설명 할 바이트 수가 더 적습니다)
Osable


1

자바 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

씨#, 191177 바이트

골프 :

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매개 변수, 그리고 환상적으로 유용 \K, preg_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은 IS 'match'; 그리고 일곱 번째 출력은 'split', 즉 일치 전후 문자열의 두 부분입니다.


1

루비, 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

온라인 테스트 ( -rURL을 통한 전달 은 지원되지 않습니다 – 직접 출력 확인)


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

@manatwork 감사합니다. 나는 정규 표현식을 충분히 사용하지 않고 (아마도 좋은 일이다) \ d를 기억하기 전에 [0-9] + 경로를 시작했다.
gabe3886

1
왜 교체 [a-z]와 함께 \D?
Roman Gräf

1
이제 no [a-z]가 있으므로 i플래그도 필요하지 않습니다.
manatwork

정규 표현식 작업에 더 많은 시간을 할애해야합니다.
gabe3886

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

그리고 할당을 c로 첫 번째 사용법으로 이동하십시오 isNaN(c=p[i++]).
manatwork

p=>{for(i=n=o=0;i<p.length;){c=p[i++];if(n++==c<59){o+=' '}o+=c}return o}
Roman Grä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}
Roman Grä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

파이썬 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를 중간 숫자로 나누고 중간에 b를 사용하여 구성 요소를 인쇄하여 -9

-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,d5 바이트를 저장합니다.
Kade

@Shebang 아주 좋은 힌트. 감사합니다
ElPedro

아, 나는 빈 줄이 틀렸다는 것을 잊었다. 당신은 단지 그것을 만들어서 또 다른 3 바이트를 절약 할 수있다 elif b:;)
Kade

0

C #, 74 바이트

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

Johan Karlsson이 JavaScript에서 수행 한 것처럼 첫 번째 숫자 세트를 캐리지 리턴, 숫자 세트 및 다른 캐리지 리턴으로 바꿉니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.