Diese Herausforderung ähnelt der anderen , aber ich habe eine Einschränkung (siehe fettgedruckten Text unten) vorgenommen, die meiner Meinung nach zu großen Unterschieden geführt hat und (ich hoffe) auch Spaß macht.
Die Herausforderung
Schreibe ein Programm oder eine Funktion in jeder Programmiersprache , die die englische Bezeichnung der eine positive ganze Zahl als Eingabe n
nicht übersteigt 100
und kehrt n
als Integer.
Standardlücken sind verboten und Sie können keine eingebauten Funktionen, externen Tools oder Bibliotheken verwenden, die diese Aufgabe bereits erfüllen .
Kürzester Quellcode in Bytes gewinnt.
Prüfung
Hier alle input->output
Fälle:
one -> 1
two -> 2
three -> 3
four -> 4
five -> 5
six -> 6
seven -> 7
eight -> 8
nine -> 9
ten -> 10
eleven -> 11
twelve -> 12
thirteen -> 13
fourteen -> 14
fifteen -> 15
sixteen -> 16
seventeen -> 17
eighteen -> 18
nineteen -> 19
twenty -> 20
twenty-one -> 21
twenty-two -> 22
twenty-three -> 23
twenty-four -> 24
twenty-five -> 25
twenty-six -> 26
twenty-seven -> 27
twenty-eight -> 28
twenty-nine -> 29
thirty -> 30
thirty-one -> 31
thirty-two -> 32
thirty-three -> 33
thirty-four -> 34
thirty-five -> 35
thirty-six -> 36
thirty-seven -> 37
thirty-eight -> 38
thirty-nine -> 39
forty -> 40
forty-one -> 41
forty-two -> 42
forty-three -> 43
forty-four -> 44
forty-five -> 45
forty-six -> 46
forty-seven -> 47
forty-eight -> 48
forty-nine -> 49
fifty -> 50
fifty-one -> 51
fifty-two -> 52
fifty-three -> 53
fifty-four -> 54
fifty-five -> 55
fifty-six -> 56
fifty-seven -> 57
fifty-eight -> 58
fifty-nine -> 59
sixty -> 60
sixty-one -> 61
sixty-two -> 62
sixty-three -> 63
sixty-four -> 64
sixty-five -> 65
sixty-six -> 66
sixty-seven -> 67
sixty-eight -> 68
sixty-nine -> 69
seventy -> 70
seventy-one -> 71
seventy-two -> 72
seventy-three -> 73
seventy-four -> 74
seventy-five -> 75
seventy-six -> 76
seventy-seven -> 77
seventy-eight -> 78
seventy-nine -> 79
eighty -> 80
eighty-one -> 81
eighty-two -> 82
eighty-three -> 83
eighty-four -> 84
eighty-five -> 85
eighty-six -> 86
eighty-seven -> 87
eighty-eight -> 88
eighty-nine -> 89
ninety -> 90
ninety-one -> 91
ninety-two -> 92
ninety-three -> 93
ninety-four -> 94
ninety-five -> 95
ninety-six -> 96
ninety-seven -> 97
ninety-eight -> 98
ninety-nine -> 99
one hundred -> 100
Antworten:
C 160 Bytes
Probier es aus
Wie es funktioniert
Nach einigen Versuchen, fand ich eine Funktion, die die "außergewöhnlichen" Zahlen abbildet
one
,two
,three
,four
,five
,six
,seven
,eight
,nine
,ten
,eleven
,twelve
,thirteen
,fourteen
,fifteen
,sixteen
,seventeen
,eighteen
,nineteen
,twenty
,thirty
,forty
,fifty
,sixty
,seventy
,eighty
,ninety
,one hundred
, auf die druckbaren ASCII - Zeichenk
,.
,[
,<
,*
,,
c
,K
,w
,y
,e
,(
,S
,_
,-
,C
,)
,7
,=
,4
,&
,o
,]
,s
,Y
,g
,m
,N
, Respectively.Diese Funktion ist:
Das Golfprogramm berechnet die
hash
Funktion der Eingabe, bis das Ende der Zeichenfolge oder des Zeichens erreicht ist-
. Dann durchsucht es den Hash in der Zeichenfolgek.[<* cKwye(S_-C)7=4&o]sYgmN
und bestimmt die entsprechende Nummer. Wenn das Ende der Eingabezeichenfolge erreicht wurde, wird die Nummer zurückgegeben. Wenn stattdessen a-
erreicht wurde, wird die Nummer plus das Ergebnis des Golfprogramms zurückgegeben, das auf den Rest der Eingabezeichenfolge angewendet wird.quelle
JavaScript (ES6),
175166163156153147 Byte7 Bytes dank @Neil gespart
Überprüfen Sie es hier:
Code-Snippet anzeigen
Wie es funktioniert
Die Grundidee ist, jede Zahl in ihre Ziffernwörter aufzuteilen und dann jedes Wort der entsprechenden Ziffer zuzuordnen. Fast alle Wörter sind so eingerichtet, dass sie mit einem einfachen regulären Ausdruck richtig übereinstimmen, aber es gibt ein paar Anomalien:
eleven
durchnineteen
: Wenn das Wort einel
oder einte
in der Mitte enthält (um dies zu vermeidenten
), fügen wiron-
am Anfang ein hinzu und ändern diese inon-eleven
durchon-nineteen
.twenty
,thirty
Usw .: ein abschließendes Ersetzeny
mit-d
Änderungen diesetwent-d
,thirt-d
etc.Jetzt teilen wir uns in Bindestriche, Leerzeichen und
dr
s. Dies teilt alles von 11 bis 99 in die entsprechenden Ziffernwörter und"one hundred"
in[one,hun,ed]
. Dann ordnen wir jedes dieser Wörter einer Reihe von Regexen zu und behalten den Index desjenigen bei, der zuerst übereinstimmt.Inzwischen ist jeder Eingang das Array der richtigen Ziffern. Alles, was wir tun müssen, ist sich ihnen anzuschließen
join``
, in eine unäre Zahl umzuwandeln+
, und wir sind fertig.quelle
.findIndex(y=>x.match(y))
funktioniert?replace
.sh + coreutils, 112 Bytes
Kann auf allen Testfällen gleichzeitig ausgeführt werden, einer pro Zeile.
Erläuterung
Das Backticked
awk
wertet dassed
Skript ausDadurch werden Teile von Zahlen in ihre numerische Darstellung umgewandelt.
Die zusätzlichen Zeilen des sed-Skripts
kümmere dich um
-ty
s undone hundred
.Schließlich entfernt führende
+
s und alles, was nicht ist+
,*
oder eine Ziffer.Es bleiben nur mathematische Ausdrücke
und kann eingespeist werden
bc
.quelle
Pyth,
79767568 BytesVielen Dank an @ETHproductions für 7 Bytes.
Grundsätzlich prüft man zuerst den Eckfall 100 und verwendet dann ein Array der ersten beiden Buchstaben der Zahlen 0 bis 11, um die Semantik der Eingabe zu bestimmen und den Wert entsprechend dem Suffix ("-ty" und "-teen"; " lv "in 12 ist ein weiterer Eckfall). Teilen Sie die Eingabe zunächst in eine Liste von Wörtern auf, ordnen Sie sie dann einem Wert zu und addieren Sie sie.
Im pythonischen Pseudocode:
Testsuite
Python 3, 218 Bytes
Grundsätzlich identisch mit der Pyth-Antwort.
Off-Topic:
Ich habe gerade eine sinnvolle Version der Antwort auf das Leben, das Universum und alles entdeckt: Es sind tee-durstige Zweige. Wow, Zweige, die sich nach Tee sehnen! Ich bin nicht sicher, wie viele andere Antworten dies tun, aber für meine Antwort, wenn die Eingabe "Tee-Durst-Zweige" ist, ist die Ausgabe 42.
quelle
"ontwthfofisiseeiniteel"
in dieses Programm ein.Python 3,
365361310303 ZeichenGolf gespielt
Ungolfed
quelle
n="one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen,twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".split(",")
Aber wie ich sehe, sollte es funktionieren, ohne es der Variablen n zuzuweisen, rufe.index()
es einfach direkt auf."one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir;four;fif;six;seven;eigh;nine;twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".replace(";","teen,").split(",")
.Haskell,
252231 BytesDadurch wird eine Liste aller englischen Nummernnamen von "Eins" bis "Neunundneunzig" erstellt und anschließend der Index der Eingabe nachgeschlagen. Wenn es nicht existiert, sind wir im Edge-Fall "einhundert", es wird also zurückgegeben
100
, andernfalls wird der Index zurückgegeben.Ungolfed
quelle
Python 2, 275 Zeichen
Es erstellt einfach eine Liste mit jeder Zahl und findet den Index.
quelle
Japt, 82 Bytes
Jeder
¿
stellt ein nicht druckbares Zeichen dar. Online testen!Basierend auf meiner Antwort von JS. Subtrahieren Sie ein Byte, wenn es sich bei der Ausgabe nicht um eine Ganzzahl handeln muss, da dies genauso aussieht wie eine Zeichenfolge.
Wie es funktioniert
quelle
JavaScript,
214199 BytesWie immer: Es stellt sich heraus, dass dies zu lang ist, um daran teilzunehmen, aber jetzt, wo ich fertig bin, wäre es eine Verschwendung, dies nicht zu posten.
Vielleicht gibt es einen offensichtlichen Weg, um weiter zu golfen, den ich übersehen habe?
JSFiddle für Testfälle
quelle
f
zuf=s=>([t,u]=s.split('-'),~s.indexOf('le')?11:~s.indexOf('lv')?12:e(t)+(t.slice(-3)=='een')*10+''+(u?e(u):t.slice(-1)=='y'?0:''))
? Ein einzelnes String-Argument kann auch an eine Funktion wie die folgende übergeben werden:s.indexOf`lv`
Perl, 158 Bytes
Läuft von der Kommandozeile aus.
one hundred
muss eingegeben werden"one hundred"
, um zu verhindern, dass es als zwei Eingänge interpretiert wird.quelle