Konvertieren Sie eine Zeichenfolge, die Ziffern als Wörter enthält, in eine Ganzzahl, wobei führende Nullen ignoriert werden.
Beispiele
"four two"
->42
."zero zero zero one"
->1
.
Annahmen
Einreichungen können davon ausgehen, dass:
- Die Eingabezeichenfolge besteht aus durch Leerzeichen getrennten Ziffernwörtern.
- Alle Wörter sind gültig (im Bereich "Null" .. "Neun") und in Kleinbuchstaben. Das Verhalten bei Leereingabe ist undefiniert.
- Die Eingabezeichenfolge stellt immer eine vorzeichenlose Zahl im Bereich von dar
int
und ist niemals eine leere Zeichenfolge.
Wertung
Antworten werden in Bytes bewertet, wobei weniger Bytes besser sind.
code-golf
string
number
conversion
Wunderkerze
quelle
quelle
range "zero".."nine"
nicht vollständig spezifiziert ist.Interpreter@"SemanticNumber"
in Mathematica genau dies tut - außer dass es bei Zeichenfolgen fehlschlägt, die mit beginnenzero zero
.Antworten:
PHP , 74 Bytes
Probieren Sie es online!
Es wurde versucht, eine Lösung zu finden, bei der vorhandene Antworten nicht kopiert werden. Ich erhalte ein zyklisches Redundanzprüfsummenpolynom mit einer Länge von 32 Bit ( crc32 ) für jedes Wort und führe dann eine Modifikation 20 und eine Modifikation 11 aus, um eindeutige Werte von 0 bis 10 (fehlende 6) für jede Ziffer zu mischen. Mit diesem eindeutigen Wert ermittle ich dann die tatsächliche Ziffer.
Weitere 74-Byte-CRC32-Alternative mit
%493%10
: Online testen !Weitere 74-Byte-CRC32-Alternative mit
%2326%11
: Online!PHP , 74 Bytes
Probieren Sie es online!
Eine andere Alternative mit der gleichen Länge nimmt das 22. Zeichen
md5
des Wortes (das einzige Zeichen, das für jedes Wort einen eindeutigen Wert angibt) und ordnet dieses Zeichen dann einer Ziffer zu.quelle
Python 2 ,
71-70Bytes-1 dank ovs (
find
anstelle vonindex
)Probieren Sie es online!
quelle
JavaScript (ES6),
70 67 6662 Byte3 Bytes dank @ovs gespart
Probieren Sie es online!
quelle
'2839016547'[parseInt(s,36)%204%13]
ist 3 Bytes kürzer.Jelly ,
1917 BytesEin monadischer Link, der eine Liste von Zeichen akzeptiert, die eine Ganzzahl ergibt.
Probieren Sie es online!
Ziemlich genau ein Port meiner Python 2-Antwort.
Bisherige
Probieren Sie es online!
Es ist
sehr wahrscheinlichein kürzerer Weg, aber dies ist ein Weg, die ersten Sinn kam zu.quelle
Python 3 ,
107,91,77, 90 Bytes-16 Bytes von Sriotchilism O'Zaic
+13 Bytes, um führende Nullen zu entfernen
Probieren Sie es online!
quelle
lstrip
Methode entfernt jedes Zeichen in der Zeichenfolge, die als Argument angegeben wird, sodass "acht zwei" zu "acht zwei" wird, während "e" entfernt wird. Außerdem sollte "null null null" "0" ausgeben und keinen Fehler ausgeben.Perl 6 ,
3532 BytesProbieren Sie es online!
Erläuterung
quelle
C (gcc) 89 Bytes
Probieren Sie es online!
Dank der cleversten Tricks von @Ceilingcat:
quelle
05AB1E ,
1816 BytesProbieren Sie es online aus.
Erläuterung:
Sehen Sie diese 05AB1E Spitze Mine (Abschnitt Wie Kompresse Strings nicht Teil des Wörterbuchs? ) Zu verstehen , warum
.•ƒ/ÿßÇf•
ist"rothuvsein"
.quelle
05AB1E ,
1716 BytesProbieren Sie es online!
Perfekte Verbindung mit der anderen 05AB1E-Antwort , aber mit einem völlig anderen Ansatz.
quelle
Retina 0.8.2 ,
4645 BytesProbieren Sie es online! Link enthält Testfälle. Erläuterung:
Setzen Sie jedes Wort in eine eigene Zeile und verdreifachen Sie es.
Transliterieren Sie das 7. Zeichen jeder Zeile mit der Zeichenfolge von @ UnrelatedString.
Löschen Sie alle verbleibenden nichtstelligen Zeichen.
Führende Nullen löschen (aber mindestens eine Ziffer belassen).
Bisherige 46-Byte-Lösung:
Probieren Sie es online! Link enthält Testfälle. Erläuterung:
Die Worte
zero
,two
,four
,six
undeight
enthalten eindeutig die Buchstabenzwuxg
. Transkribieren Sie diese in die geraden Ziffern.Für die ungeraden Ziffern passen Sie einfach die ersten beiden Buchstaben jedes Wortes einzeln an.
Löschen Sie alle verbleibenden nichtstelligen Zeichen.
Führende Nullen löschen (aber mindestens eine Ziffer belassen).
quelle
Jelly ,
201817 BytesProbieren Sie es online!
-2 Bytes vom Ausführen von "rothuvsein" durch den String-Kompressor von user202729 .
-1 Byte davon, Jonathan Allans nullfreien Enklact-String gestohlen und in ein geringfügig anders strukturiertes Programm eingefügt zu haben.
quelle
C ++ (gcc) ,
478218142 Bytes- (sehr) danke an Jo King
Probieren Sie es online!
quelle
Japt , 13 Bytes
Versuch es
Sieht aus wie alle auf die gleiche Idee hat mich sonst - selbst die Mühe , ein Skript zu Brute - Force des Schreibens die optimale Saite für die Kompression gespeichert haben könnte, nur das zu finden, die bis zu Index
1,000,000
(es früh war, ich hatte nicht meine Koffein noch!), "rothuvsein" ist die einzig mögliche Saite!Die komprimierte Zeichenfolge enthält die Zeichen in Codepoints
206
,168
,117
,118
,160
und136
.quelle
Ruby ,
63 Bytes,52 Bytes, 50 Bytes-2 dank Wert Schwärze Spitze
quelle
$*
ist dies ein Alias für. SieARGV
können ihn also verwenden, um zusätzliche Bytes zu sparen.T-SQL, 110 Bytes
Zeilenumbruch dient nur der Lesbarkeit.
Die Eingabe erfolgt über die Tabelleich , Je unseren IO Regeln . Ich hätte 14 Bytes einsparen können, indem ich eine Zeichenfolgenvariable vorab aufgefüllt hätte, aber das ist nur zulässig, wenn die Sprache keine anderen Eingabemethoden hat.
Erläuterung:
STRING_SPLIT
Nimmt die Eingabezeichenfolge und trennt sie an den LeerzeichenCHARINDEX
Nimmt die ersten 2 Zeichen und gibt die (1-basierte) Position in der Zeichenfolge zurück'_ontwthfofisiseeini'
.'ze'
for zero ist nicht in der Zeichenfolge und gibt 0 für "not found" zurück. Der Unterstrich stellt sicher, dass wir nur ein Vielfaches von zwei erhalten.STRING_AGG
Zerschmettert die Ziffern ohne Trennzeichen0+
Erzwingt eine implizite Konvertierung in INT und löscht alle führenden Nullen.1*
würde auch funktionieren.quelle
x86-Maschinencode, 46 Byte
Hexdump:
Es ist eine
fastcall
Funktion - empfängt einen Zeiger auf den String inecx
und gibt das Ergebnis in zurückeax
.Die Hash - Funktion vervielfacht durch eine magische Zahl
1856645926
, tut einXOR
mit dem Eingabebyte und verschiebt sich um 2 Bits nach rechts.Das Speichern und Wiederherstellen von Noclobber-Registern (
edi
undebx
) dauerte 4 Byte, aber ich fand keinen effizienteren Weg, dies zu implementieren. Speichern der Konstante 10 inebx
war besonders ärgerlich!Demontage mit entsprechenden Code-Bytes:
Äquivalenter C-Code:
quelle
Sauber , 88 Bytes
Probieren Sie es online!
Stark basierend auf Jonathan Allans Antwort .
Verwendet ein Verständnis für die Indizierung anstelle von
indexOf
/elemIndex
.quelle
J , 38 Bytes
Probieren Sie es online!
quelle
Holzkohle , 19 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Port von @ KevinCruijssens 05AB1E Antwort. Erläuterung:
quelle
PowerShell , 48 Byte
Probieren Sie es online!
Verwendet den gleichen
rothuvsein
Trick wie andere, dank Jonathan Allan. Erwartet Eingabeargumente über Splatting, das sich in TIO als separate Befehlszeilenargumente manifestiert.quelle
Kotlin, 83 Bytes
+1 Byte, wenn Sie Longs mit unterstützen möchten
toLong()
Gleicher rothuvsein Trick wie die anderen, spart dank kotlins nettem
toInt()
und ein paar wertvolle Bytesfold()
. Ich kann das Gefühl nicht loswerden, dass noch mehr Bytes entfernt werden können ...quelle
sed -re , 78 Bytes
quelle
Windows Batch, 169 Bytes
quelle
Perl 6 , 45 Bytes
Probieren Sie es online!
quelle
VBA, 160 Bytes
Entspricht den ersten beiden Zeichen einer Zeichenfolge, ohne Null.
quelle
BaCon ,
8372 BytesUnter der Annahme, dass die Zeichenfolge in w $ angegeben ist, sucht dieser Code den Index in "zeontwthfofisiseeini" mit einem regulären Ausdruck, der auf den eindeutigen ersten beiden Zeichen jedes Wortes basiert. Der Index wird dann durch 2 geteilt, um das richtige Ergebnis zu erhalten.
quelle