Katalog produktów

17

Ten problem dotyczy rozdzielenia łańcucha reprezentującego identyfikator produktu na trzy składniki.

  • Pierwsza część składa się z górnej i dolnej litery o dowolnej długości, która reprezentuje magazyn.
  • Druga część to cyfry reprezentujące numer produktu. Ta część ma również dowolną długość.
  • Ostatnia część kwalifikuje się jako rozmiar i kolory, a ta część trwa do końca łańcucha. Kwalifikatory zaczynają się od dużej litery i składają się ze znaków alfanumerycznych.

Każda część powinna być wydrukowana wyraźnie oddzielona. Gwarantujemy, że każda część nie jest pusta.

Zwycięzcą jest ten, który używa najmniej bajtów do rozwiązania tego problemu.

Przykład: Dane
wejściowe: UK7898S14 Dane

wyjściowe:
UK
7898
S14

Tutaj Wielka Brytania to Wielka Brytania, 7898 to kod produktu, a S14 to rozmiar 14.

Przykład 2: Dane
wejściowe: cphDK1234CYELLOWS14QGOOD Dane

wyjściowe:
cphDK
1234
CYELLOWS14QGOOD

Tutaj cphDK to Kopenhaga, Dania, 1234 to kod produktu, CYELLOWS14QGOOD reprezentuje żółty kolor, rozmiar 14 i dobrą jakość.

Highace2
źródło
2
Czy każda część jest niepusta?
Karl Napf,
@KarlNapf Tak. Każda część jest niepusta.
Highace2
@Emigna Dodano przykład dodawania.
Highace2
„Pierwsza część składa się z wielkich i małych liter” - Być może jeden z przykładów może zawierać taką kombinację wielkich i małych liter. A może także kod kraju, który nie ma 2 znaków. Ponadto, czy kwalifikator może zawierać znaki niealfanumeryczne, takie jak „Jakość ★★★ ☆☆”?
manatwork
Witamy w PPCG!
Erik the Outgolfer

Odpowiedzi:

10

Perl, 12 bajtów

11 bajtów kodu + 1 bajt na -pflagę.

s/\d+/
$&
/

Aby uruchomić:

perl -pe 's/\d+/
$&
/' <<< "CYELLOWS14QGOOD"
Dada
źródło
2
Uwielbiam prostotę! :)
Dom Hastings,
4

APL, 18

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

Działa poprzez przeszukanie pierwszych 2 punktów, w których następuje zmiana znaku na cyfrę lub odwrotnie, i użycie ich do podzielenia łańcucha.

Moris Zucca
źródło
4

Siatkówka , 28 14 10 8 bajtów

Zaoszczędź 4 bajty dzięki Dom Hastings .
Zaoszczędzono 2 bajty dzięki Martinowi Enderowi .

S1`(\d+)

Wypróbuj online!

Emigna
źródło
Korzystając z tego samego mechanizmu, co odpowiedź @ Dady, możesz zapisać kolejne 4 bajty: retina.tryitonline.net/... (tbh, prawdopodobnie nawet więcej, ale to wszystko, co mogłem zaoszczędzić! :))
Dom Hastings
@DomHastings. Ach, fajny pomysł na zastąpienie!
Emigna
3

Haskell, 36 bajtów (bez wyrażenia regularnego)

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

To daje wynik w formacie ("UK",("7898","S14")). Chodzi o podzielenie na pierwszą cyfrę, a następnie podzielenie reszty na pierwszą cyfrę. Wypróbuj na Ideone .

Zgarb
źródło
Ładne użycie fmap na krotce.
xnor
3

JavaScript, 38 36 bajtów

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

Przykład

Florent
źródło
@Arnauld Dobry połów.
Florent,
3

JavaScript (ES6), 28 26 bajtów

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

Zaoszczędź 2 bajty dzięki @Grax

Przykłady

Johan Karlsson
źródło
Możesz zmniejszyć 2 kolejne znaki, używając $ & w zamianie i usuwając nawiasy. s=>s.replace(/\d+/,` $& `)
Grax32,
2

Gema, 17 12 znaków

(Trick nie obchodzenia się z kodu kraju wyraźnie bezwstydnie pożyczoną od Dada „s Perl rozwiązanie . Wrażenia powinny być wyrażone tam).

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

Przykładowy przebieg:

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

bash-4.3$ gema '<D>*=\n$1\n*' <<< 'cphDK1234CYELLOWS14QGOOD'
cphDK
1234
CYELLOWS14QGOOD
człowiek w pracy
źródło
2

Python 2, 40 bajtów

Nie znam dużo Regex, ale na szczęście ten problem jest dość prosty :) Dzieli łańcuch wejściowy na listę długości 3, która zawiera każdą część.

import re
lambda k:re.split('(\d+)',k,1)
Kade
źródło
2

05AB1E ,39 37 16 bajtów

Zaoszczędził wiele bajtów dzięki Emignie.

Wykorzystuje kodowanie 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

Wypróbuj online!

(To mój pierwszy post tutaj!)

Osable
źródło
Możesz zapisać co najmniej 14 bajtów, sprawdzając cyfry zamiast liter . I to może być bardziej golfa.
Emigna,
Witamy również w PPCG :)
Emigna
Dzięki! I masz rację, właściwie to ja byłem naiwny, dosłownie od lewej do prawej. Próbowałem też kopać, .páà¬żeby zdobyć pierwszą część, ale na pierwszy rzut oka nie wydaje się to pomocne.
Osable
Zaktualizuj swoją odpowiedź za pomocą mojego kodu (i zagraj w golfa, jeśli możesz). Nie uważam, że jest wystarczająco inny, by uzasadnić własną odpowiedź.
Emigna,
Ok, zrobię to wtedy, gdy znalazłem sposób, aby umieścić go w pętli. Nic nadzwyczajnego, ale przynajmniej spada do 16 bajtów. Jeszcze raz dziękuję! (Teraz muszę zaktualizować objaśnienia ... ale jest mniej bajtów do wyjaśnienia)
Osable
1

JavaScript (ES6), 36 bajtów

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

Przykłady

Arnauld
źródło
1

Java 7, 200 185 174 167 bajtów

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

Kod niepoznany i testowy:

Wypróbuj tutaj.

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

Wynik:

UK 7898 S14 
cphDK 1234 CYELLOWS14QGOOD 
Kevin Cruijssen
źródło
1

C #, 191 177 bajtów

Gra w golfa:

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

Nie golfowany:

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

EDYCJA 1: @ Link Ng zapisał 14 bajtów.

paldir
źródło
Nie potrzebujesz ToCharArray (). ciąg jest już IEnumerable <char>
Link Ng
Oczywiście nie mogę uwierzyć, że tego nie zauważyłem.
paldir
1

PHP, 48 bajtów

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

Dzięki $limitparametru, a fantastycznie użyteczny \K, preg_split()jest idealnym miejscem na to wyzwanie.

użytkownik59178
źródło
1

MATLAB, 81 73 bajtów

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

Funkcja, która akceptuje ciąg znaków i zwraca tablicę komórek złożoną z trzech ciągów znaków. Testowany w wersji R20105b.

Przykładowe zastosowanie:

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

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

Wyjaśnienie

Wyrażenie regularne (?<=^\D+)\d+')pasuje do grupy cyfr poprzedzonych cyframi od początku łańcucha; te ostatnie nie są częścią meczu.

Czwarte wyjście regexpto 'match'; a siódmym wyjściem są 'split'dwie części ciągu przed i po dopasowaniu.

Luis Mendo
źródło
1

Rubinowy, 28 bajtów

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

To otacza pierwszy zestaw cyfr z nowymi liniami.

Lee W.
źródło
0

jq, 47 znaków

(43-znakowy kod + 4-znakowe opcje wiersza poleceń).

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

(Znów stara historia: na początku dość elegancka, a potem boleśnie gadatliwa).

Przykładowy przebieg:

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

Test on-line (Przekazanie -radresu URL nie jest obsługiwane - sprawdź sam wynik wyjściowy).

człowiek w pracy
źródło
0

PHP, 61 59 56 55 bajtów

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

To również generuje kod początkowy:

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

Edytować

Dzięki @manatwork za zapisanie dla mnie kilku bajtów.
Dzięki @ RomanGräf za kolejne kilka zapisanych bajtów

gabe3886
źródło
1
[\d]? : o \dwystarczy.
manatwork
@manatwork Thanks. Nie używam wystarczająco wyrażenia regularnego (prawdopodobnie dobra rzecz) i zacząłem w dół [0-9] + trasy, zanim przypomnę sobie o \ d
gabe3886
1
Dlaczego nie zastąpi [a-z]z \D?
Roman Gräf,
1
Teraz, gdy nie masz [a-z], iflaga też nie jest potrzebna.
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}

Philipp Flenker
źródł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.

LegionMammal978
źródło
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")
rnso
źródło
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"
Billywob
źródło
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
Jonathan Allan
źródło
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;
}
Steadybox
źródło
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
ElPedro
źródło
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.

Grax32
źródło