Produktkatalog


17

In diesem Problem wird eine Zeichenfolge, die eine Produktkennung darstellt, in drei Komponenten unterteilt.

  • Der erste Teil besteht aus beliebig langen oberen und unteren Buchstaben, die das Lager darstellen.
  • Der zweite Teil besteht aus Ziffern, die die Produktnummer darstellen. Dieser Teil ist ebenfalls von beliebiger Länge.
  • Der letzte Teil ist Qualifizierer wie Größe und Farben, und dieser Teil fährt bis zum Ende der Zeichenkette fort. Die Qualifikationsmerkmale beginnen garantiert mit einem Großbuchstaben und bestehen aus alphanumerischen Zeichen.

Jeder Teil sollte klar getrennt gedruckt werden. Es ist garantiert, dass jedes Teil nicht leer ist.

Der Gewinner ist derjenige, der die wenigsten Bytes verwendet, um dieses Problem zu lösen.

Beispiel:
Eingabe: UK7898S14

Ausgabe:
UK
7898
S14

Hier ist Großbritannien, 7898 ist der Produktcode und S14 ist Größe 14.

Beispiel 2:
Eingabe: cphDK1234CYELLOWS14QGOOD

Ausgabe:
cphDK
1234
CYELLOWS14QGOOD

Hier ist cphDK Kopenhagen, Dänemark, 1234 ist der Produktcode, CYELLOWS14QGOOD steht für gelbe Farbe, Größe 14 und gute Qualität.


2
Ist jedes Teil nicht leer?
Karl Napf

@ KarlNapf Ja. Jeder Teil ist nicht leer.
Highace2

@Emigna Ein zusätzliches Beispiel wurde hinzugefügt.
Highace2

„Der erste Teil besteht aus Groß- und Kleinbuchstaben“ - Vielleicht könnte eines der Beispiele eine solche Mischung aus Groß- und Kleinbuchstaben enthalten. Und vielleicht auch eine Landesvorwahl, die nicht 2 Zeichen lang ist. Kann das Qualifikationsmerkmal auch nicht alphanumerische Zeichen enthalten, z. B. "Qualität ★★★ ☆☆"?
Handarbeit

Willkommen bei PPCG!
Erik der Outgolfer

Antworten:


10

Perl, 12 Bytes

11 Byte Code + 1 Byte für -pFlag.

s/\d+/
$&
/

Um es auszuführen:

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

2
Liebe die Einfachheit! :)
Dom Hastings

4

APL, 18

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

Durchsucht die ersten beiden Punkte, an denen ein Wechsel von Zeichen zu Ziffer oder umgekehrt stattfindet, und teilt die Zeichenfolge mit diesen Punkten.



3

Haskell, 36 Bytes (kein regulärer Ausdruck)

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

Dies gibt das Ergebnis im Format ("UK",("7898","S14")). Die Idee ist, bei der ersten Ziffer zu teilen und dann den Rest bei der ersten Nicht-Ziffer zu teilen. Probieren Sie es auf Ideone .


Gute Verwendung von fmap für ein Tupel.
8.


3

JavaScript (ES6), 28 26 Bytes

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

2 Bytes dank @Grax gespart

Beispiele


Sie können 2 weitere Zeichen reduzieren, indem Sie in Ihrem Ersetzen $ & verwenden und die Klammern entfernen. s=>s.replace(/\d+/,` $& `)
Grax32

2

Gema, 17 12 Zeichen

(Der Trick , den Ländercode nicht explizit Umgang schamlos ausgeliehen von Dada ‚s Perl - Lösung . Appreciation sollte zum Ausdruck gebracht werden.)

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

Probelauf:

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 Bytes

Ich kenne nicht viel Regex, aber zum Glück ist dieses Problem einfach genug :) Trennt die Eingabezeichenfolge in eine Liste der Länge 3, die jeden Teil enthält.

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

2

05AB1E ,39 37 16 Bytes

Dank Emigna wurden viele Bytes gespart.

Es wird die CP-1252-Codierung verwendet.

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

Probieren Sie es online!

(Dies ist mein erster Beitrag hier!)


Sie können mindestens 14 Bytes speichern, indem Sie Ziffern anstelle von Buchstaben markieren . Und das kann wahrscheinlich mehr golfen werden.
Emigna

Willkommen auch bei PPCG :)
Emigna

Vielen Dank! Und Sie haben Recht, tatsächlich bin ich in dieser Sache ganz naiv geworden, buchstäblich von links nach rechts. Ich habe auch versucht zu graben .páà¬, um den ersten Teil zu bekommen, aber es scheint auf den ersten Blick nicht für den Rest zu helfen.
Osable

Fühlen Sie sich frei, Ihre Antwort mit meinem Code zu aktualisieren (und spielen Sie noch ein bisschen Golf, wenn Sie können). Ich glaube nicht, dass es anders genug ist, um seine eigene Antwort zu rechtfertigen.
Emigna

Ok, ich werde es dann tun, da ich einen Weg gefunden habe, es in eine Schleife zu bringen. Nichts zu raffiniertes, aber zumindest geht es auf 16 Bytes runter. Danke nochmal! (Jetzt muss ich die Erklärungen aktualisieren ... aber es gibt weniger zu erklärende Bytes)
Osable

1

JavaScript (ES6), 36 Byte

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

Beispiele


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 & Testcode:

Probieren Sie es hier aus.

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

Ausgabe:

UK 7898 S14 
cphDK 1234 CYELLOWS14QGOOD 

1

C #, 191 177 Bytes

Golf gespielt:

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 sparte 14 Bytes.


Sie brauchen ToCharArray () nicht. Zeichenfolge ist bereits IEnumerable <char>
Link Ng

Natürlich kann ich nicht glauben, dass ich das nicht bemerkt habe.
Paldir

1

PHP, 48 Bytes

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

Mit seinen $limitParametern und die phantastisch nützlich \K, preg_split()ist für diese Herausforderung perfekt.


1

MATLAB, 81 73 Bytes

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

Funktion, die eine Zeichenfolge akzeptiert und ein Zellenarray mit drei Zeichenfolgen zurückgibt. Getestet in Version R20105b.

Beispiel Verwendung:

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

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

Erläuterung

Der reguläre Ausdruck (?<=^\D+)\d+')entspricht einer Gruppe von Ziffern, denen vom Anfang der Zeichenfolge an keine Ziffern vorangestellt sind. Letztere sind nicht Teil des Spiels.

Die vierte Ausgabe von regexpist die 'match'; und die siebte Ausgabe ist die 'split', dh die zwei Teile der Zeichenkette vor und nach dem Match.


1

Ruby, 28 Bytes

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

Dies umgibt den ersten Ziffernblock mit Zeilenumbrüchen.


0

47 Zeichen

(43 Zeichen Code + 4 Zeichen Befehlszeilenoptionen.)

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

(Wieder die alte Geschichte: am Anfang ziemlich elegant, dann wird sie schmerzhaft wortreich.)

Probelauf:

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

Online-Test (Die Weitergabe -rüber eine URL wird nicht unterstützt. Prüfen Sie die Raw-Ausgabe selbst.)


0

PHP, 61 59 56 55 Bytes

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

Dies gibt auch den Anfangscode aus:

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

Bearbeiten

Vielen Dank an @manatwork für die Speicherung einiger Bytes.
Vielen Dank an @ RomanGräf für die Speicherung einiger weiterer Bytes


1
[\d]? : o \dist genug.
Handarbeit

@manatwork Danke. Ich verwende nicht genug Regex (wahrscheinlich eine gute Sache) und bin die [0-9] +
-Route entlang gegangen,

1
Warum nicht ersetzen [a-z]mit \D?
Roman Gräf

1
Jetzt, da Sie keine haben [a-z], wird die iFlagge auch nicht benötigt.
Handarbeit

Ich muss wirklich mehr Zeit damit verbringen, an regulären Ausdrücken zu arbeiten.
gabe3886

0

JavaScript ohne 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
Sie könnten alle Initialisierungen an einem einzigen Ort setzen: o=n=i=''.
Handarbeit

Und bewegen Sie die Zuordnung zu c zu seiner ersten Nutzung: isNaN(c=p[i++]).
Handarbeit

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, die Initialisierung soll ''da bleiben das o, mit dem das Ergebnis verkettet wird. Leider funktioniert Ihr Code bei mir nicht. N muss bedingt erhöht werden.
Handarbeit

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]&

Anonyme Funktion. Nimmt eine Zeichenfolge als Eingabe und gibt eine Liste von Zeichenfolgen als Ausgabe zurück.


0

Schläger 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)))))

Testen:

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

Ausgabe:

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

0

R, 63 52 Bytes

Bearbeiten: Speichert dank @JDL eine Menge Bytes

Übernimmt die Eingabe von stdin und druckt nach stdout:

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

Beispielausgabe:

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

Wäre nicht gsub (...,"\\1 \\2 \\3")effizienter?
JDL

@ JDL Ich bin mir nicht sicher, ob ich folge. Möchten Sie ein Beispiel nennen oder ausarbeiten?
Billywob

so etwas wie gsub("([A-Za-z]+)([0-9]+)(.+)","\\1 \\2 \\3",scan()), obwohl das erste Argument wahrscheinlich als etwas kleineres ausgedrückt werden kann ...
JDL

@JDL Sehr clever, aber ich habe keine Ahnung, wie der "\\1 \\2 \\3"Ersatz funktioniert. Auch das Regex-Muster wurde ein wenig aktualisiert und verwendet ignore.case = TRUE.
Billywob

Sie bedeuten nur "Ausgabe, was auch immer im ersten / zweiten / dritten ()Klammerpaar erfasst wurde .
JDL

0

Jelly , 14 Bytes

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

TryItOnline!

Wie?

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

Rufen Sie an mit:

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

0

Python 2, 103 94 88 Bytes

Lösung ohne Verwendung von 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

Extrahiert einfach die Zahlen aus der Mitte und schneidet die Eingabe mit der Zahl als Index. Erfordert Anführungszeichen um die Eingabe, aber ich habe nirgends festgestellt, dass Anführungszeichen nicht zulässig sind.

-9 durch Teilen von a auf die mittlere Zahl und Drucken der Komponenten mit b in der Mitte

-6 Danke an @Shebang

Testfälle

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

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

b!="" -> b>""und c=a.split(b) -> c,d=a.split(b) ... print c[0],b,c[1] -> print c,b,dspart 5 Bytes.
Kade

Sehr nette Hinweise @Shebang. Vielen Dank
ElPedro

Ah, ich habe vergessen, dass leere Zeichenfolgen falsch sind. Sie können weitere 3 Bytes speichern, indem Sie es einfach machen elif b:;)
Kade

0

C #, 74 Bytes

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

Ersetzen Sie die erste Ziffernfolge durch Wagenrücklauf, Ziffernfolge und eine weitere Wagenrücklauffolge, wie es Johan Karlsson für JavaScript getan hat.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.