Ürün kataloğu


17

Bu sorun, bir ürün tanımlayıcısını temsil eden bir dizeyi üç bileşene ayırmakla ilgilidir.

  • İlk bölüm, depoyu temsil eden keyfi uzunluktaki üst ve alt harflerden oluşur.
  • İkinci kısım ürün numarasını temsil eden rakamlardır. Bu kısım da keyfi uzunluktadır.
  • Son bölüm boyut ve renkler olarak niteleyicilerdir ve bu bölüm dizenin sonuna kadar devam eder. Niteleyicilerin büyük harfle başlaması ve alfasayısal karakterlerden oluşması garanti edilir.

Her parça açıkça ayrılmış olarak yazdırılmalıdır. Her parçanın boş olmadığı garanti edilir.

Kazanan, bu sorunu çözmek için en az bayt kullanan kişidir.

: Örnek
Girişi: UK7898S14

Çıkış:
UK
7898
S14

İşte İngiltere İngiltere, 7898 ürün kodu ve S14 boyut 14.

Örnek 2:
Giriş: cphDK1234CYELLOWS14QGOOD

Çıktı:
cphDK
1234
CYELLOWS14QGOOD

Burada cphDK Kopenhag, Danimarka, 1234 ürün kodudur, CYELLOWS14QGOOD sarı rengi, 14 numarayı ve kaliteyi temsil eder.


2
Her bölüm boş değil mi?
Karl Napf

@KarlNapf Evet. Her bölüm boş değil.
Highace2

@Emigna Şimdi bir ek örnek eklenmiştir.
Highace2

“İlk bölüm büyük ve küçük harflerden oluşur” - Belki örneklerden biri büyük ve küçük harflerin bu karışımını içerebilir. Ve belki de 2 karakter uzunluğunda olmayan bir ülke kodu. Ayrıca, niteleyici “Kalite ★★★ ☆☆” gibi alfasayısal olmayan karakterler içerebilir mi?
manatwork

PPCG'ye Hoşgeldiniz!
Outgolfer Erik

Yanıtlar:


10

Perl, 12 bayt

11 bayt kod + -pbayrak için 1 bayt .

s/\d+/
$&
/

Çalıştırmak için:

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

2
Sadeliği seviyorum! :)
Dom Hastings

4

APL, 18

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

Karakterden basamağa veya tam tersine bir değişiklik olduğu ilk 2 noktayı arayarak ve dizeyi bölmek için bunları kullanarak çalışır.



3

Haskell, 36 bayt (normal ifade yok)

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

Bu, sonucu formatta verir ("UK",("7898","S14")). Fikir, ilk basamakta bölmek ve daha sonra geri kalan kısmı ilk basamak olmayan kısımda bölmektir. Ideone üzerinde deneyin .


Bir demet üzerinde fmap güzel kullanımı.
xnor

3

JavaScript, 38 36 bayt

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

Misal


@ Arnauld İyi yakaladım.
Florent

3

JavaScript (ES6), 28 26 bayt

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

@Grax sayesinde 2 bayt kaydedildi

Örnekler


Değiştirdiğinizde $ & öğesini kullanarak ve parantezleri kaldırarak 2 karakteri daha azaltabilirsiniz. s=>s.replace(/\d+/,` $& `)
Grax32

2

Gema, 17 12 karakter

(Açık bir şekilde shamelessly ödünç ülke kodunu işleme değil hile dada sitesindeki Perl çözeltisi . Takdir orada ifade edilmelidir.)

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

Örnek çalışma:

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 Bayt

Çok fazla Regex bilmiyorum, ama neyse ki bu sorun yeterince basit :) Giriş dizesini her parçayı içeren uzunluk 3 listesine ayırır.

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

2

05AB1E ,39 37 16 bayt

Emigna sayesinde çok bayt tasarruf etti.

CP-1252 kodlaması kullanır.

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

Çevrimiçi deneyin!

(Bu benim ilk yazım!)


Harfler yerine rakamları kontrol ederek en az 14 bayt kaydedebilirsiniz . Ve bu muhtemelen daha fazla golf edilebilir.
Emigna

Ayrıca, PPCG'ye hoş geldiniz :)
Emigna

Teşekkürler! Ve haklısın, aslında tam anlamıyla soldan sağa, bu konuda saf oldum. Ayrıca .páà¬ilk kısmı almak için kazmaya çalıştım , ama ilk bakışta geri kalanı için yardımcı görünmüyor.
Osable

Feel free to update your answer with my code (and golf it some more if you can). I don't feel that it's different enough to warrant it's own answer.
Emigna

Ok I'll do it then as I found a way to put it in a loop. Nothing too sophisticated, but at least it goes down to 16 bytes. Thank you again! (Now I have to update the explanations... but there are fewer bytes to explain)
Osable

1

JavaScript (ES6), 36 bytes

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

Examples


1

Java 7, 200 185 174 167 bytes

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;}

Ungolfed & test code:

Try it here.

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"));
  }
}

Output:

UK 7898 S14 
cphDK 1234 CYELLOWS14QGOOD 

1

C#, 191 177 bytes

Golfed:

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)}");

Ungolfed:

    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 saved 14 bytes.


You don't need ToCharArray(). string is already IEnumerable<char>
Link Ng

Of course, I can't believe I didn't notice this.
paldir

1

PHP, 48 bytes

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

With its $limit parameter, and the fantastically useful \K, preg_split() is perfect for this challenge.


1

MATLAB, 81 73 bytes

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

Function that accepts a string and returns a cell array of three strings. Tested in version R20105b.

Example use:

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

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

Explanation

The regular expression (?<=^\D+)\d+') matches a group of digits preceded by non-digits from the start of the string; the latter are not part of the match.

The fourth output of regexp is the 'match'; and the seventh output is the 'split', that is, the two parts of the string before and after the match.


1

Ruby, 28 bytes

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

This surrounds the first cluster of digits with newlines.


0

jq, 47 characters

(43 characters code + 4 characters command line options.)

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

(Again the old story: fairly elegant at the beginning, then becomes painfully verbose.)

Sample run:

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

On-line test (Passing -r through URL is not supported – check Raw Output yourself.)


0

PHP, 61 59 5655 bytes

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

This does output the initial code as well:

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

Edit

Thanks to @manatwork for saving a few bytes for me
Thanks to @RomanGräf for another few bytes saved


1
[\d]? :o \d is enough.
manatwork

@manatwork Thanks. I don't use regex enough (arguably a good thing) and started down the [0-9]+ route before remembering about \d
gabe3886

1
Why not replace [a-z] with \D?
Roman Gräf

1
Now that you have no [a-z], the i flag is not needed either.
manatwork

I really need to pend more time working on regular expressions.
gabe3886

0

JavaScript without regex, 84 81 79 bytes

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


2
You could put all initializations in a single place: o=n=i=''.
manatwork

And move the assignment to c to its first usage: 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, the initialization should remain '' because the o, to which the result will be concatenated. But sadly your code is not working for me, n needs to be incremented conditionally.
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 bytes

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

Anonymous function. Takes a string as input, and returns a list of strings as output.


0

Racket 274 bytes

(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))))

Ungolfed:

(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)))))

Testing:

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

Output:

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

0

R, 63 52 bytes

Edit: Saved a bunch of bytes thanks to @JDL

Takes input from stdin and prints to stdout:

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

Example output:

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

Wouldn't gsub (...,"\\1 \\2 \\3") be more efficient?
JDL

@JDL Not sure I follow. Care to elaborate or give an example?
Billywob

something like gsub("([A-Za-z]+)([0-9]+)(.+)","\\1 \\2 \\3",scan()), though the first argument can probably be expressed as something smaller than that...
JDL

@JDL Very clever but I have no idea how the "\\1 \\2 \\3" replacement works though. Also updated the regex pattern a bit and use ignore.case = TRUE.
Billywob

They just mean "output whatever was captured in the first/second/third pair of () brackets.
JDL

0

Jelly, 14 bytes

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

TryItOnline!

How?

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 bytes

#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)}

Call with:

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

0

Python 2, 103 94 88 bytes

Solution without using regex

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

Simply extracts the numbers from the middle then slices the input using the number as an index. Requires quotes around the input but I didn't see anywhere that quotes are disallowed.

-9 by splitting a on the middle number then print the components with b in the middle

-6 Thanks to @Shebang

Test Cases

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

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

b!="" -> b>"" and c=a.split(b) -> c,d=a.split(b) ... print c[0],b,c[1] -> print c,b,d saves 5 bytes.
Kade

Very nice hints @Shebang. Thanks
ElPedro

Ah, I forgot empty strings are falsy. You can save another 3 bytes by just making it elif b: ;)
Kade

0

C#, 74 bytes

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

Replace 1st set of digits with carriage return, set of digits, and another carriage return, as Johan Karlsson did for JavaScript.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.