Aufgabe
Ausgehend von einer Folge von englischen Ziffernnamen, die wie folgt „zusammengebrochen“ sind:
zeronineoneoneeighttwoseventhreesixfourtwofive
Teilen Sie die Zeichenfolge wieder in Ziffern auf:
zero nine one one eight two seven three six four two five
Regeln
Die Eingabe ist immer eine Zeichenfolge. Es besteht immer aus einem oder mehreren zusammengeklappten englischen Ziffernnamen in Kleinbuchstaben und sonst nichts.
- Die englischen Ziffernnamen sind
zero one two three four five six seven eight nine
.
- Die englischen Ziffernnamen sind
Die Ausgabe kann eine Liste von Zeichenfolgen oder eine neue Zeichenfolge sein, bei der die Ziffern durch nicht alphabetische, nicht leere Zeichenfolgen begrenzt sind. (Ihre Ausgabe kann optional auch solche Zeichenfolgen am Anfang oder Ende enthalten, und die Begrenzer müssen nicht konsistent sein. Daher ist auch so etwas
{{ zero0one$$two );
eine gültige (wenn auch absurde) Antwort fürzeroonetwo
.)Die kürzeste Antwort in Bytes gewinnt.
Testfälle
three -> three
eightsix -> eight six
fivefourseven -> five four seven
ninethreesixthree -> nine three six three
foursixeighttwofive -> four six eight two five
fivethreefivesixthreenineonesevenoneeight -> five three five six three nine one seven one eight
threesevensevensixninenineninefiveeighttwofiveeightsixthreeeight -> three seven seven six nine nine nine five eight two five eight six three eight
zeroonetwothreefourfivesixseveneightnine -> zero one two three four five six seven eight nine
Antworten:
Netzhaut , 20 Bytes
Probieren Sie es online!
quelle
C (GCC) ,
89 80 76 75 72 71 7069 BytesProbieren Sie es online!
(89) Gutschrift an gastropner für den XOR-Hash.
(76) Toby Speight für die Idee, den 1. und 3. zu verwenden.
(75) Dank an Michael Dorgan für
'0'
→48
.(72) Dank an Michael Dorgan und Lynn für Literale mit Steuerzeichen.
(69) Dank an Lynn für
x?y:0
→x&&y
quelle
Python 2 , 50 Bytes
Probieren Sie es online!
-3 danke an Lynn .
-4 dank Uriel 's Antwort ist regex.
quelle
import re;re.compile('…').findall
sollte ein paar Bytes sparen. Ich habe erwartet, dass dies zu Regex Golf wird :)Befunge,
87858176 BytesProbieren Sie es online!
Befunge verfügt über keine Anweisungen zur Manipulation von Zeichenfolgen. Wir erstellen also eine Art Hash der letzten drei Zeichen, während wir sie verarbeiten.
Dieser Hash ist im Wesentlichen eine dreistellige Basis-104-Zahl. Jedes Mal, wenn ein neues Zeichen gelesen wird, modifizieren wir den Hash mit 104 2 , um das älteste Zeichen zu entfernen, multiplizieren ihn mit 104, um Platz für das neue Zeichen zu schaffen, und fügen dann den ASCII - Wert des neuen Zeichens Mod 27 hinzu (um sicherzugehen) es läuft nicht über).
Zu Vergleichszwecken nehmen wir diesen Wert mod 3817, schreiben ihn in den Speicher (kürzen ihn also auf 8 Bit), was zu kleineren Zahlen führt, die für Befunge leichter zu handhaben sind. Die Hashes, mit denen wir dann vergleichen müssen, sind 0, 38, 59, 64, 88, 92, 114, 117 und 123. Wenn einer dieser Hashes übereinstimmt, haben wir eine Zeichenfolge gefunden, die das Ende von markiert Zahl, also geben wir ein zusätzliches Leerzeichen aus und setzen den Hash auf Null zurück.
Wenn Sie sich fragen, warum Base 104 oder warum Mod 3817? Diese Werte wurden sorgfältig ausgewählt, damit die zu vergleichende Hash-Liste in möglichst wenigen Bytes dargestellt werden kann.
quelle
Java (OpenJDK 8) ,
554643 Bytes9 Bytes sparen dank Forty3 / FrownyFrog
3 Bytes sparen dank Titus
Probieren Sie es online!
edit: Danke für die Begrüßung und Erklärung von Lambdas!
quelle
g
Regex-Suffix stattAll
).f=(s)=>
stattdessen verwendets->
, was 4 Bytes kürzer ist.C (GCC) ,
179159146139137116107103102 BytesEdit 1: (Vorschläge von Mr. Xcoder hinzugefügt - danke! - Meine Makroversion hatte dieselbe Größe wie Ihre, aber ich mag Ihre besser.)
Edit 2: Geänderte Charaktereigenschaften im Vergleich zu Anrufen mit
strchr()
Edit 3: K & R's die var Deklarationen (Eww!)
Edit 4: Wenn 1 Makro nicht ausreicht ...
Edit 5: Neu gemacht mit dem oben vorgeschlagenen neuen Algorithmus. Vielen Dank an James Holderness für diese großartige Idee!
Edit 6: 0-Set entfernt, da es automatisch dorthin zu gehen scheint - Verwendete Master-Level-Code- Golftechniken (Kommas, Printf-Trick usw.) - Danke Gastropner !
Edit 7: Benutze memchr und behebe einen Fehler, auf den James Holderness hingewiesen hat .
Edit 7: Verwenden Sie
&&
bei der Endabnahme zu ersetzen?
- danke jxh .Probieren Sie es online!
Nicht golfen (was ehrlich gesagt immer noch sehr golfen ist ...)
Alte, einfache grep-esqe-Lösung:
Alte, sauberere Version.
Probieren Sie es online!
quelle
#define
ingputchar
und ein Paar unnötiger Klammer zu entfernen.#define p putchar(
anstelle (beachten Sie die öffnende Klammer).c,h=0;f(char*s){while(c=*s++)putchar(c),h=h%10816*104+c%27,c=h%3817,printf(" "+!(c&&strchr("&;@X\\ru{",c)));}
JavaScript,
6657524441 Bytess=>s.replace(/one|t[wh]|.i|[fsz]/g," $&")
Ziemlich naiv, aber es funktioniert.
Schöner Fang von FrownyFrog, um 2 Zeichen zu verwenden. Mit Ausnahme von "eins", bei dem ein reiner 2-Zeichen-Check die Null durcheinander bringen könnte. Edit: Die Single
f
unds
waren gute Fänge von FrownyFrog, die ich bei meinen ersten beiden Golfspielen übersehen habe.Vielen Dank, Neil, für den Vorschlag eines unbenannten Lambdas und die Möglichkeit, mit einem einzigen Char
z
52 zu erreichen.Titus wartet mit einem kleineren RegEx auf. Ich habe das Gefühl, dass wir uns irgendwann Uriels Regex nähern.
quelle
z|tw|th|f|s|ei|ni|on
on|t[wh]|.i|[fsz]
(-4 Bytes)on|
übereinstimmenzeronine
zer onine
Retina ,
2423 BytesProbieren Sie es online! Bearbeiten: 1 Byte dank @FrownyFrog gespeichert.
quelle
.....
->.{5}
arbeiten?C
10399 BytesDies funktioniert für jede Zeichenkodierung (einschließlich umständlicher Zeichen wie EBCDIC), da der numerische Wert der eingegebenen Zeichen nicht verwendet wird. Stattdessen werden der erste und der dritte Buchstabe in einer magischen Zeichenfolge lokalisiert. Der Abstand zwischen diesen gibt an, wie viele Buchstaben bei jedem Ausdruck vorgeschoben werden müssen.
Testprogramm
quelle
J ,
37-35BytesProbieren Sie es online!
quelle
f=:[:>'..[eox]|[tse]?....'&rxall
und es hat in Interpeter funktioniert, aber in TIO funktioniert es nicht.C (gcc) ,
106 Bytes,104 Bytes-2 Bytes dank @jxh
Probieren Sie es online!
XOR ist wirklich unser größter Verbündeter.
quelle
s[1]
wird kürzer sein.Retina , 28 Bytes
Probieren Sie es online!
quelle
Pyth ,
35 2723 BytesDurch die Portierung von Uriels Ansatz wurden viele Bytes gespart .
Probieren Sie es hier aus! Anfänglicher Ansatz.
quelle
Pip , 27 Bytes
Übernimmt die Eingabe als Befehlszeilenargument. Probieren Sie es online!
Einfacher Regex-Austausch, fügt vor jedem Treffer ein Leerzeichen ein
[zfs]|one|[ent][iwh]
.Das Springen auf den Zug des
Diebstahls vonUriels Regex ergibt 23 Bytes (mit-s
Flagge):quelle
Jelly ,
2321 BytesEin vollständiges Programm, das zeilenweise getrennte Ausgaben druckt. Hinweis: Sobald dies erledigt ist, werden wiederholt leere Zeilen "für immer" ausgegeben (bis zu einer riesigen Rekursionsgrenze oder einem Seg-Fehler).
Probieren Sie es online! (TIO-Ausgabe wird akkumuliert, eine lokale Implementierung wird zeilenweise gedruckt.)
Wie?
Beginnend mit einer Liste von Zeichen wiederholt das Programm:
Die Länge des ersten Wortes wird bestimmt, indem die ersten drei Zeichen der aktuellen Zeichenliste (notwendigerweise Teil des ersten Wortes) überprüft werden. Das Programm konvertiert diese in Ordnungszahlen, multipliziert sie miteinander, moduliert das Ergebnis mit 953, moduliert das Ergebnis mit sieben, moduliert das Ergebnis mit drei und addiert drei:
quelle
C
168,145,144141 BytesEDIT: Versucht init 'i' zu 1 wie so
Um führende Whitespaces loszuwerden,
die bei Eingaben ab drei, sieben oder acht unterbrochen werden
141
Probieren Sie es online aus
144
Probieren Sie es online aus
168
Probieren Sie es online!
Ungolfed
int-Konstanten werden durch Verschieben von << 8 unnötig groß,
aber wenn Sie sich mit Strings vergleichen können, sollte dies die natürlichste sein
146 Stringvergleich verwenden
Verwenden des Zeichenfolgenvergleichs
Verschleiert
quelle
Jelly , 44 Bytes
Probieren Sie es online!
quelle
Ganz schön lang. Sie können gerne Golf spielen.
R 109 Bytes
Probieren Sie es online!
quelle
intToUtf8
! 90 Bytes wären mit einem anderen Ansatz unter Verwendung von Regexp möglich:function(x,p=paste,z=p("(",p(c("zero",broman::numbers),collapse="|"),")"))gsub(z,"\\1 ",x)
Haskell , 81 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Python 3 (kein regulärer Ausdruck) , 85 Byte
Probieren Sie es online!
quelle
while s[i:]
und dann können Sie dies durch Übermitteln eines rekursiven Werts auf 93 Byte reduzierenlambda
(Funktionen müssen nur die Ausgabe zurückgeben, anstatt sie selbst zu drucken).Excel, 181 Bytes
Platziert einen Raum vor:
z
,on
,tw
,th
,f
,s
,ei
,ni
quelle
Z80-Assembly,
46 -45 Byte(Es hat Spaß gemacht, den kühlen Regex des Uriel an eine regex-unfreundliche Umgebung anzupassen).
quelle
Jelly ,
40 bis39 BytesProbieren Sie es online!
Wie es funktioniert
quelle
QuadS ,
21 bis20 BytesProbieren Sie es online!
Dies ist ein Port meiner Retina-Antwort .
quelle
APL (Dyalog Unicode) , 25 Byte
Probieren Sie es online!
quelle
Python 3 , kein regulärer Ausdruck,
83 68 6563 Bytes-15 danke an Lynn (Refaktor in eine einzelne Funktion)
-3 mehr danke an Lynn (vermeide das Indizieren in eine Liste mit mehr Arithmetik)
... was zu einer weiteren Einsparung von 2 Bytes führt (vermeide Klammern mit negativen Modulos) :)
Eine Funktion, die die durch Zeilenumbrüche getrennten Wörter druckt und dann ein auslöst
IndexError
.Probieren Sie es online! (unterdrückt die Ausnahmen, um mehrere Läufe innerhalb der Testsuite zuzulassen)
quelle
def f(s):h=[4,5,3][ord(s[0])*ord(s[1])%83%7%3];print(s[:h]);f(s[h:])
h(s)
undh(s)
wie habe ich das nicht bemerkt ?! Vielen Dank Lynn!h=(ord(s[0])*ord(s[1])%83%7+1)%3+3
es sind 65 Bytes! :)Gelee , 36 Bytes
Probieren Sie es online!
Algorithmus:
Ich wette, wir können es noch besser machen.
quelle
Mathematica, 125 Bytes
Probieren Sie es online!
TIO gibt eine Fehlermeldung über "CountryData" (???) aus.
Ich weiß nicht, warum dies passiert, aber auf Mathematica funktioniert alles einwandfrei
quelle
Perl 6 ,
4230 BytesProbier es aus
Testen Sie es
(Übersetzt aus anderen Antworten)
quelle
q / kdb +
5951 BytesLösung:
Beispiel:
Erläuterung:
Schnelle Lösung, wahrscheinlich bessere und golffähigere Ansätze.
Anmerkungen:
46 Bytes mit etwas einfachem Golfen, wobei q-Calls durch k-Calls ersetzt werden, aber immer noch eine gewaltige Lösung.
asc[(,/)x ss/:($)`z`one`tw`th`f`s`ei`ni]cut x:
quelle