Diese Herausforderung basiert auf diesem Video . Ich empfehle, dass Sie es sehen, bevor Sie diese Herausforderung versuchen.
Zuerst definieren wir eine Funktion. Diese Funktion ( OEIS ) nimmt eine ganze Zahl n als Eingabe und gibt die Anzahl der Buchstaben in der englischen Darstellung von n aus (ohne Leerzeichen oder Bindestriche). Zum Beispiel "drei" hat 5 Buchstaben, also 3 Karten zu 5.
Wie im Video gezeigt, wird aus dem Wiederholen einer beliebigen Zahl schließlich eine Vier, die sich für immer auf sich selbst überträgt.
Hier ist eine grobe gerichtete Grafik, die die Umlaufbahnen der Zahlen unter 16 zeigt:
12 11
\|
15 2 6 1 10 14 13
\ \|/ / / /
7 3-/ 8--/
\| /
9 0 5--/
\ \|
\-4
Ihre Herausforderung besteht darin, die Anzahl der Schritte zu bestimmen, die eine Zahl ausführen wird (oder wie oft diese Funktion auf eine Zahl angewendet werden muss), bevor Sie vier erreichen (dh die Stufe in der abgebildeten Grafik).
Englisch Zahlen bilden
Hier ist eine kurze Erklärung, wie man englische Wörter für diese Herausforderung bilden sollte:
Die Nummern eins bis neunzehn sind:
eins, zwei, drei, vier, fünf, sechs, sieben, acht, neun, zehn, elf, zwölf, dreizehn, vierzehn, fünfzehn, sechzehn, siebzehn, achtzehn, neunzehn
Für Zahlen größer als neunzehn ist der Prozess wie folgt:
Wenn die Zahl eine Hunderterstelle hat, beginnen Sie mit dem Namen der Ziffer in der Hunderterstelle und "Hundert".
z.B
100 -> "onehundred"
Wenn der Rest weniger als zwanzig beträgt, fügen Sie die englische Darstellung des Restes hinzu.
z.B
714 -> "sevenhundredfourteen"
Andernfalls, wenn die Zehnerstelle nicht Null ist, fügen Sie die richtige Darstellung hinzu:
2-> twenty
3-> thirty
4-> forty
5-> fifty
6-> sixty
7-> seventy
8-> eighty
9-> ninety
z.B
470 -> "fourhundredseventy"
Schließlich, wenn es eine eigene Ziffer gibt, wird deren Darstellung angehängt
z.B
681 -> "sixhundredeightyone"
Weitere Bestimmungen
Bei Zahlen größer als einhundert sollten Sie das "und" weglassen, wenn Sie die Anzahl der Buchstaben zählen. Zum Beispiel ist 577 "fünfhundertseventyseven", das 23 Buchstaben hat.
Ihr Programm muss alle Ganzzahlen größer als 0 und kleiner als 1.000 als Eingabe über Standardmethoden akzeptieren.
Ihr Programm muss die Anzahl der Schritte ausgeben, die für Standardausgabemethoden erforderlich sind.
Das ist Codegolf, also gewinnt die Lösung mit den wenigsten Bytes.
Testfälle
1 -> 3
4 -> 0
7 -> 2
23 -> 5
577 -> 6
600 -> 4
quelle
Antworten:
JavaScript (ES6), 106 Byte
Strings scheinen der beste Weg zu sein, um die Länge zu kodieren, trotz des Overheads bei der numerischen Konvertierung.
quelle
Python mit num2words,
97 113 115 94 9392 Bytes+16 Bytes (die hyphenation vergessen , dass num2words gilt , die nicht tatsächlich , die Ergebnisse von den Testfälle ändern, obwohl
23
und577
jeweils einen Bindestrich)+2 Bytes (vergessen umfassen ,
f=
obwohl rekursiv)-20 Bytes (Verwendung
re
)-8 Bytes dank @Wheat Wizard (verwenden
~
, ersetzenn!=4
durchn-4
und ... einzeiliger Import> _ <)-1 Bytes dank @Cyoce (Leerzeichen von
4 and
)Zählt nur die Anzahl der Schritte auf; funktioniert auch für große und negative ganze Zahlen (
\W
findet die Leerzeichen, Kommas und Bindestriche im Ergebnis von num2words):Hier ist der letzte Fall, Schritt für Schritt:
quelle
f=
vor Ihrer Lambda-Funktionimport re,num2words as r
anstelle der beiden verschiedenen Anweisungen.n-4
ist das Gleiche wien!=4
num2words
istw
,re
ist immer nochre
- beachten Sie, dass sowohl das Modul als auch die Funktion aufgerufen werdennum2words
and 1+
kann durch ersetzt werdenand-~
, um ein Byte zu speichernPyth - 54 Bytes
Wird versuchen, umzugestalten.
Test Suite .
quelle
Mathematica, 89 Bytes
Typisches Mathematica: eingebaute Funktionen gut, lange Funktionsnamen schlecht.
FixedPointList
Wendet das erste Argument (eine Funktion) wiederholt auf das zweite Argument an, bis sich die Antwort nicht mehr ändert, und listet alle Ergebnisse auf. Die Ergebnisse enthalten die ursprüngliche Eingabe und zwei Kopien der wiederholten Ausgabe, daher die-2
am Ende. Die eingebaute MathematicaIntegerName
enthält Leerzeichen und Bindestriche, daher müssen wir diese von Hand entfernen.Ärgerlicherweise
IntegerName
enthält die Ausgabe des Dokuments das Zeichen "-" (Unicode # 8208) und keine normalen Bindestriche. Aus diesem Grund hat diese Übermittlung statt 88 nur 89 Byte. (Und ich konnte dem obigen Code keine vier Leerzeichen voranstellen und das Unicode-Zeichen akzeptieren - eine Hilfe? -, sodass der obige Code nicht genau richtig funktioniert, wenn er ausgeschnitten und eingefügt wird .)quelle
Python 2.7,
344216208 Bytes:Verwendet im Gegensatz zu anderen Python-Antworten keine externen Bibliotheken. Nimmt Ein-
stdin
und Ausgänge aufstdout
.Repl.it mit allen Testfällen!
Erläuterung
Zunächst werden 3 Wörterbücher erstellt, wobei jedes die Länge der englischen Wortrepräsentationen jeder Zahl mit der Zahl paart, die es in dem geschlossenen Intervall
[1,9]
an den Stellen Eins, Zehn bzw. Hundert darstellt. Zum Beispiel kann der erste Eintrag im Wörterbuchd
ist1:3
wie1
geschrieben istone
in Englisch und hat3
Buchstaben.Dann wird jede Ziffernstelle in einer Zeichenfolgeeingabe
x
ihrem entsprechenden Wörterbuch zugewiesen, wonach jede Zahl an jeder Stelle mit ihrem Wert im entsprechenden Wörterbuch abgeglichen wird. Angenommen, die eingegebene Nummer war23
. Die Stelle20
an der Zehnerstelle würde mit dem Wörterbuch gepaart, mite
dem es abgeglichen wird6
, und die Stelle3
an der Einerstelle würde mit dem Wörterbuch gepaart, mitd
dem es abgeglichen wird5
. Diese übereinstimmenden Ziffern werden dann addiert, um die Länge der englischen Darstellung der Nummer darzustellen, diex
als Zeichenfolge zugewiesen ist, und, solangex!='4'
die while-Schleife fortgesetzt wird, inkrementiertc
um1
jedes Mal, um die Anzahl der bisher durchgeführten Schritte darzustellen. Daher23
würde entsprechen11
, was wiederum entsprechen6
würde, sich zu wenden3
und dann zu5
und schließlich zu4
, was zu5
Gesamtschritten führen würde.Schließlich wird, sobald die Schleife beendet
c
ist, ausgegeben,stdout
um den "Abstand zu vier" darzustellen, der in diesem Fall sein würde5
.quelle
Java,
556295 BytesVielen Dank an @KevinCruijssen für das Speichern von 261 Bytes
Ungolfed:
quelle
s++
es auf einem String-Array nicht möglich ist ..: Ss
. Übrigens, Sie können Ihren Code um eine ziemlich große Menge wieint c(int n){int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8,6,9,9,11,10,6,5,5,5,7,6,6},c=0,t=(int)Math.pow(10,(int)Math.log10(n)),x=1;while(n>0)if(n/100>0)c+=s[n/100]+7;else{if(n>0&n<25){c+=s[n];break;}else c+=s[(n/10)+22];}n%=t;t/=10;}for(;c!=4;x++,c=s[c]);return x;}