CodeGolf Challenge
PWSSHHHH! Sie wachen im Jahr 3000 in einem Kryotechnik-Labor auf. Nachdem Sie zur Einsatzzentrale begleitet wurden, um Ihren Karrierechip zu erhalten, vermutlich den eines Boten, stellt eine Sonde fest, dass Sie aus dem Jahr 2000 stammen stereotype Vorurteile , man wird im vergleich zum heutigen modernen menschen als dumm angesehen und gezwungen gradeschool zu wiederholen.
Sie betreten Ihr Klassenzimmer in der ersten Klasse und der Lehrer gibt einen Auftrag. Sie sagt oder schreibt eine Zahl bis zu 50. Wenn sie die Zahl an die Tafel schreibt (zum Beispiel: 25), müssen Sie die Zahlen bis zu dieser Zahl "eins, zwei, drei, ..., fünfundzwanzig" sagen ". Wenn sie die Nummer laut ausspricht (zum Beispiel: "Sechs"), müssen Sie auf Ihrem Tablet die Nummern bis zu dieser Nummer "1, 2, 3, 4, 5, 6" schreiben.
Dies wird sehr mühsam und Sie beschließen, den Prozess mit Ihren noch funktionierenden und dennoch archaischen Programmierkenntnissen des 21. Jahrhunderts zu automatisieren.
Zielsetzung:
Ihr Programm sollte eine Eingabe nehmen. Diese Eingabe ist entweder eine Dezimalzahl ( 1 thru 50
) oder eine ausgeschriebene Zahl ( one thru fifty
).
• Wenn es sich bei der Eingabe um eine Dezimalzahl handelt, sollte Ihre Ausgabe in ausgeschriebener Form von eins bis zu dieser Zahl zählen. (zB zweiunddreißig )
• Wenn es sich bei der Eingabe um eine ausgeschriebene Zahl handelt, sollte Ihre Ausgabe von 1 bis zu dieser Zahl in Dezimalform zählen. (zB 32 )
Regeln:
Die Ein- und Ausgabe kann in jedem beliebigen Fall erfolgen (Sie können also ein Programm erstellen, das nur Großbuchstaben akzeptiert, wenn dies gewünscht wird).
Eingegebene Dezimalzahlen müssen nicht vom Typ Zahl sein (z. B. int). Sie können eine Eingabezeichenfolge mit Zahlen sein (25 vs "25"). Entweder ist alles in Ordnung und Sie können auswählen, welches Programm von Ihrem Programm akzeptiert werden soll. (Ihr Programm muss nicht beide akzeptieren)
Für den ausgeschriebenen Stil ist KEIN Bindestrich zwischen zusammengesetzten Wörtern erforderlich. Sie können dies jedoch auch tun, wenn Sie dies wünschen.
Ausgabewerte müssen in irgendeiner Form getrennt werden, ein beliebiges Trennzeichen ist in Ordnung 1,2,3
1 2 3
etc
Sie können keine zusätzlichen Bibliotheken wie num2words (Python) usw. hinzufügen (Systembibliotheken sind jedoch in Ordnung).
Obwohl die Hintergrundgeschichte besagt, dass Sie aus dem Jahr 2000 stammen, können Sie Sprachen verwenden, die nach diesem Datum erstellt wurden (lol)
Das ist Code-Golf , also gewinnt das Programm mit dem kürzesten bytecount!
Antworten:
Perl 6 ,
119113 BytesUnicode-Datenbank FTW!
Verwendet ausgeschriebene Zahlen in Großbuchstaben ohne Bindestrich, z
TWENTYTWO
.Gibt eine Liste von Zeichenfolgen oder einen Bereich von Zahlen zurück. (Beide verwenden Leerzeichen als Trennzeichen, wenn sie mit gedruckt werden
put
.)quelle
Python3,
276271269243237235232217 BytesEin Hinweis aus der @smls-Perl-Einreichung ...
Ich vermute, es könnte ein bisschen weiter golfen werden.
Es verwendet die Systembibliothek
unicodedata
, um nach Namen für Nummern zu suchen.FORTY TWO
Als Eingabe sind Namen von Großbuchstaben (durch Leerzeichen getrennt:) oder Dezimalzahlen erforderlich.(Dies ist meine erste Code Golf Einreichung.)
(Mir ist auch gerade aufgefallen, dass ich die Länge (Codierung) falsch gezählt habe. Das sind also ein paar Bytes weniger als bisher angenommen. Ich habe jedoch nur die letzte Byteanzahl aktualisiert. Hoppla.)
quelle
unicodedata
ist eine Systembibliothek, die mit der Standardinstallation geliefert wird, keine "zusätzliche" Bibliothek, die separat installiert werden muss.for
Schleife einfügen und zwischen den einzelnen Ausgaben Zeilenumbrüche einfügen.print()
Es ist egal, ob es eine ganze Zahl oder eine Zeichenfolge ist. Probieren Sie es online!import*
stattdessenimport name
ein paar Bytes speichernGemeines Lisp,
297253243242144128Einzelheiten
~[ 0 ~; 1 ~; ... ~:; else ~]
ist ein Schalter, der auf dem Wert des nächsten verfügbaren Arguments basiert und zum entsprechenden Untersteuerungsformat springt. Hier habe ich nur einen Fall von "0" und für "sonst". Dies wird verwendet, um vor jeder Zahl ein Trennzeichen einzufügen, mit Ausnahme der ersten, dank U, das bei Null beginnt.~:[ FALSE ~; TRUE ~]
ist ein bedingtes Format; Hier geben wir die Dinge unterschiedlich aus, unabhängig davon, ob es sich bei der Eingabe s um eine Zeichenfolge handelt oder nicht.~R
Schreiben Sie eine Zahl als eine englische Kardinalzahl, während Sie~D
die Zahl einfach ausdrucken.Beispiele
quelle
f
, dass "(f 2)" eins, zwei "und(f "two")
" 1, 2 "druckt, sieht es für Sie gut aus?JavaScript ES6,
559 526 381 368 364 358 332 327315 BytesVielen Dank an Kritixi Lithos für die Idee, das Array zu teilen, und an Arnauld für den 1 / n-Trick.
quelle
var
und Sie können das Array['one,'two',..]
zu ändern"one0two0three0...".split(0)
null, Array(n)
.!isNaN(n)
durch1/n
. Dies gibt IhnenNaN
für eine Zeichenfolge (falsch), einen Gleitkommawert ungleich Null für eine Ganzzahl ungleich Null (wahr) oderInfinity
für 0 (auch wahr).Python 2 ,
503499494490479 Bytes-5 danke an @JonathanAllan
Probieren Sie es online!
Geben Sie entweder eine Zahl oder eine durch Leerzeichen getrennte Schreibweise einer Zahl ein.
Etwas weniger Golf und besser lesbare Version:
quelle
l="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nin#".replace("#","teen ").split()
e
von verpasstnineteen
.Scheme,
161,152, 149Unkomprimiert:
quelle
string->number
, ob dies der Fall ist. Ich habe es schnell überprüft und es scheint verwendet zu werden, um z. B. einen String"4"
in eine Zahl umzuwandeln4
.(string->number "four")
kehrt zurück#f
.PHP -
397372349344329 BytesInspiriert von der JS-Lösung von TomDevs
Durch Ersetzen
$a=[...]
durch 25 Byte gespart$a=explode(...)
Durch Zurückschalten auf ein Array ohne Zeichenfolgenbegrenzer und Speichern
teen
in einer Variablen dank @ user59178 wurden weitere 23 Byte gespeichertDurch Entfernen der
(int)
Typumwandlung wurden weitere 5 Bytes gespartGespeichert weitere 15 Bytes , die durch Fallenlassen
$b
, die$i
in denfor
Erklärungen und die geschweiften Klammern, dank @ zu user59178 wiederUngolfed:
Versuchen Sie es mit einer Eingabezeichenfolge oder einer Eingabenummer
quelle
teen
eine Variable zu speichern , anstatt sie jedes Mal zu wiederholen. Als solches würde es werden:$a=[one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir.$t=teen,four.$t,fif.$t,six.$t,seven.$t,eigh.$t,nine.$t];
;)
$b
indem Sie das zweite Array direkt in foreach ablegen und ablegen, 6 weitere Bytes, indem Sie alle geschweiften Klammern ablegen (obwohl Sie die$a=$c
in das Setup der for-Schleife einfügen müssen) und 6 weitere Bytes, indem Sie nachträglich erhöhen$i
wenn Sie es verwenden, anstatt im 'After'-Bit der for-Schleifen.for ($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];
Python 2, 262 Bytes
repl.it
Eingabe- und Ausgabezeichenfolgen sind klein und verkettet *. Geben Sie zum Testen einer Zeichenfolgeneingabe beispielsweise
"thirtyfive"
an der Eingabeaufforderung ein.Erstellt die Liste aller Wörter (plus
"fiftyone"
bis"fiftynine"
),x
testet dann, obinput
es sich um ein Wort mit dem Proxy handeltv>50
(Zeichenfolgen sind größer als Zahlen in Python 2 und alle Zahlen im gültigen Eingabebereich aus der Spezifikation sind<=50
) undprint
s die entsprechenden Werte, indem Sie entweder die Liste aufteilenx[:v]
oder einen Bereich von ganzen Zahlen aufbauenrange(1,x.index(v)+2)
.* Hinzufügen hyphenation auf beide Kosten 11 Bytes, durch Ersatz
a+"ty"b
mita+"ty"+'-'*(b>'')+b
.quelle
Wolfram-Sprache, 92 Bytes
(Ich bin neu in diesem Bereich, lass es mich wissen, wenn ich etwas falsch gemacht habe.)
quelle
Do[Print@If[#>0,i,,IntegerName@i],{i,If[#>0,#,,Interpreter["SemanticNumber"]@#]}]&
JavaScript (ES6), 261 Byte
Hinweis: Die Zeichenfolge, die z zugewiesen ist, wird mit codiert
atob
. In der codierten Zeichenfolge befinden sich 11 Bytes, die ich nicht auf dieser Site veröffentlichen kann, selbst wenn es sich um gültige Zeichen in einer JavaScript-Zeichenfolge handelt. Also habe ich ein Hex-Escape in der Form \ xHH verwendet. Jedes dieser Escapes wird als 1 Byte gezählt.Die ursprüngliche unkomprimierte Saite ist die weniger golfene Version.
Weniger golfen
Prüfung
quelle
ö\x89ÞöÜ(öØ...
Dieses Zeug ist großartig hahaaPython 3 ,
305303 BytesAuf Empfehlung von @ nedla2004 auf Python 3 konvertiert. Es ist jetzt auch kein Leerzeichen zwischen den eingegebenen oder ausgegebenen Zahlen vorhanden, zB geben Sie zweiundzwanzig ein
Probieren Sie es online 3!
Python 2 ,
327320313308 BytesProbieren Sie es online 2!
163170177 Bytes kürzer als meine ursprüngliche Antwort, daher poste ich sie als Alternative. Dies verwendetfor
die beiden Listen, um eine vollständige Liste aller Zeichenfolgendarstellungen der Zahlen zu erstellen, identifiziert dann die richtige in der Liste und druckt alles bis zu dieser entweder nach Wert oder nach Index. Gibt für jeden Wert eine neue Zeile aus.quelle
Python 2,
432 422 416403 BytesIch bin sicher, dass dies verbessert werden kann. Zumindest, wenn ich mit der Hardcodierung des zu bearbeitenden Werts durchkomme und keine Funktion benötige, kann ich 20 speichern. Es wird ein Leerzeichen benötigt, um Wörter bei der Texteingabe zu trennen. Dank JonathanAllans Kommentar zu ElPedros Antwort, 4 für die Neuordnung der Mathematik, 6 Bytes gespart.
(Hinweis: In der aktuellen Version werden Tabulatoren anstelle von Leerzeichen verwendet. QPaysTaxes fügte ein einzelnes Leerzeichen hinzu, da dies nicht ordnungsgemäß gerendert wurde, um sicherzustellen, dass der angegebene Code kompiliert wird. Die Byteanzahl sollte nicht geändert werden.)
quelle
len(`f`)>2
kann...`f`[2:]
für weitere 3 sein, glaube ich. (Ignorieren Sie die...
kann nicht scheinen, um die Backticks richtig zum Laufen zu bringen)f>50
für 6 gehen (und ein anderes, indem Sie nicht verwendend
)TypeError: 'int' object has no attribute '__getitem__'
. Wenn ich numerische Eingabe als String übergeben,f[2:]
kommt näher , aber immer noch nicht, wenn sie als boolean trated (print f[2:] and True
druckt eine leere Zeile , wenn Len (f) <2, nichtTrue
oderFalse
)f>50
arbeitet, danke. Das Löschend
ist nicht so einfach, da ich den Endwert der Schleife immer inf
Zeile 8 eingeordnet habe, damit er nicht geändert werden kann,if f>50
da er niemals wahr ist.C ++ 11,
484480477 BytesTexteingabe in Kleinbuchstaben ohne Bindestriche.
quelle
PowerShell , 362 Byte
Probieren Sie es online! Worteingabe oder Zahleneingabe
Das ist ein richtiges Durcheinander, und ich bin nicht besonders glücklich damit, aber hier ist es. Golfvorschläge sind willkommen.
Die erste Zeile besteht aus
$z
einem Array der vollständigen englischen Wörter. Sie können die-split0
for-Nummern1
für12
und die Schleife für die Konstruktion allerteen
s sehen, und dann gibt es eine Reihe von Logik, um alles richtig zusammenzusetzen. Probieren Sie es online!Die zweite Zeile beginnt mit einer Logik. Wir nehmen die Eingabe
$args
(als Zeichenfolge),-split
speichern sie auf Leerzeichen, speichern sie$n
zur späteren Verwendung, nehmen das erste[0]
Wort und das erste[0]
Zeichen davon und prüfen, ob es sich um-in
einen Bereich handelt48..57
(dh ASCII0
bis9
). Wir prüfen also, ob wir eine Dezimaleingabe oder eine englische Eingabe haben. Probieren Sie es online!Im ersten Fall erstellen wir einen Bereich basierend auf den Dezimaleingaben
$n[0]..$n[2]
und indizieren diesen$z[...]
. Im anderen Fall finden wir.indexOf()
das erste und das letzte Wort und bilden daraus nur einen numerischen Bereich. In beiden Situationen befindet sich jetzt ein Array von Objekten in der Pipeline (entweder Zeichenfolgen oder Ganzzahlen), und ein impliziterWrite-Output
Zeitpunkt der Programmbeendigung gibt uns eine neue Zeile zwischen den Elementen.quelle
Swift3, 402 Bytes
Ungolfed:
Hier gibt es nichts Besonderes, nur ein Array zum Sichern der ausgeschriebenen Zahlen.
Ich dachte ursprünglich diese Lösung mit dieser anderen Methode, um das
values
Array zu berechnen :Welches könnte golfen werden, um:
Ersetzen der 3. Zeile im Golfcode
Ich hätte 381 Bytes erfassen können, aber es gibt einen Compilerfehler, der besagt: "Ausdruck war zu komplex, um in angemessener Zeit gelöst zu werden". Weitere Informationen zu dem Fehler finden Sie hier
quelle
R
452430424 BytesPlatziert die Zahlen in einem data.frame mit ausgeschriebenen Zahlen als Spaltennamen, wodurch die Übersetzung zwischen den beiden (und das anschließende Drucken) ziemlich einfach wird.
Der Hauptversuch beim Golfen bestand darin, die ausgeschriebenen Zahlen für 20-49 zu erstellen, wahrscheinlich viel mehr, um hier zu golfen.
Ich habe versucht
as.matrix
, den data.frame nur mit den Zahlen zu drucken, aber es verbleibt noch ein Matrix-Header. Hoffentlich ist das in Ordnung.Ungolfed:
quelle
o=c("","one","two","three","four","five","six","seven","eight","nine") ; v=c("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"); w=c("twenty","thirty","forty"); a=data.frame(0:50, c(o,v, sapply(w[1:3],function(y) sapply(o,function(x) paste0(y,x))),"fifty")); b=which(a==i); a[if(b<52) 2:b else 2:(b-51),ifelse(b<52,2,1)]
C
342331 BytesProbieren Sie es online!
quelle
SAS, 179
Die Ausgabe wird durch Zeilenumbrüche getrennt in das Protokoll geschrieben. SAS hat ein eingebautes Format für die Umwandlung von Ziffern in Wörter, was ein großer Vorteil für diese Herausforderung ist, aber ärgerlicherweise fehlt es an Informationen für das Umkehren.
quelle