Als ich ein Kind war und die Dollarnoten zu meinen Ersparnissen zählen wollte, zählte ich laut:
eins zwei drei vier fünf sechs sieben acht neun zehn;
elf, zwölf, dreizehn, vierzehn, fünfzehn, sechzehn, siebzehn, achtzehn, neunzehn, zwanzig;
einundzwanzig, zweiundzwanzig, dreiundzwanzig, vierundzwanzig, fünfundzwanzig ...
Schließlich hatte ich es satt, jede dieser mehrsilbigen Zahlen auszusprechen. Aus mathematischen Gründen habe ich eine wesentlich effizientere Methode zum Zählen entwickelt:
eins zwei drei vier fünf sechs sieben acht neun zehn;
eins, zwei, drei, vier, fünf, sechs, sieben, acht, neun, zwanzig;
eins, zwei, drei, vier, fünf, sechs, sieben, acht, neun, dreißig ...
Wie Sie sehen, würde ich nur die Ziffern aussprechen, die sich von der vorherigen Nummer geändert haben. Dies hat den zusätzlichen Vorteil, dass es sich bei Zahlen wesentlich häufiger als die englischen Namen wiederholt und daher weniger Brainpower für die Berechnung benötigt.
Herausforderung
Schreiben Sie ein Programm / eine Funktion, die eine positive Ganzzahl aufnimmt und ausgibt / zurückgibt, wie ich es zählen würde: das ist die am weitesten rechts stehende Ziffer ungleich Null und alle nachfolgenden Nullen.
Beispiele
1 1
2 2
10 10
11 1
29 9
30 30
99 9
100 100
119 9
120 20
200 200
409 9
1020 20
Eine vollständige Liste der Testfälle sollte nicht erforderlich sein. Dies ist A274206 auf OEIS.
Regeln
- Ihre Eingabe muss theoretisch für alle positiven Ganzzahlen funktionieren, wobei Genauigkeits- und Speicherprobleme ignoriert werden.
- Ein- und Ausgabe müssen dezimal sein.
- Sie können festlegen, ob die Eingabe und / oder Ausgabe als Zahl, Zeichenfolge oder Ziffernfolge erfolgen soll.
- Die Eingabe ist garantiert eine positive Ganzzahl. Ihre Eingabe kann alles für ungültige Eingaben tun.
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
[1,0,2,0]
->[2,0]
für den letzten Testfall? (Ich bin nicht sicher, was den Ausdruck "Einzelelement-Array" angeht).Antworten:
Python 2 , 28 Bytes
Probieren Sie es online!
Eine rekursive Formel funktioniert sehr sauber. Wenn die letzte Ziffer ungleich Null ist, geben Sie sie aus. Entfernen Sie andernfalls die letzte Null, berechnen Sie die Ausgabe dafür und multiplizieren Sie sie mit 10.
quelle
Gelee ,
63 Bytes-3 Bytes durch Eingabe / Ausgabe als dezimale Ziffernliste .
Testsuite bei Online testen !
Wie?
Wenn wir keine Dezimallisten erstellen könnten, wäre ein 6-Byte-Wert:
Was Sie hier sehen können .
Dies macht dasselbe, konvertiert aber vorher eine Ganzzahl in eine Dezimalliste und anschließend zurück in eine Ganzzahl.
quelle
C
302927 BytesDarauf bin ich stolz, da ich zwei C-Exploits missbrauche, um dies zu verbessern (beschrieben am Ende des Beitrags). Dies ist speziell für C (GCC)
3)
b=10;f(a){a=a%b?:b*f(a/b);}
// 27 Bytes2)
// 29 Bytesb;f(a){b=a=a%10?:10*f(a/10);}
1)
// 30 Bytesf(i){return i%10?:10*f(i/10);}
Probieren Sie es online aus (27-Byte-Version)
Erster Versuch (30 Byte): Nutzt die Tatsache, dass in GCC der bedingte Wert zurückgegeben wird, wenn in ternary kein Wert deklariert wird. Daher ist mein ternärer Operator für den Wahrheitswert leer.
Zweiter Versuch (29 Bytes): Missbraucht einen Speicherfehler in GCC, wenn meines Wissens nach eine Funktion keinen Rückgabewert hat, wenn mehr als zwei Variablen in der Funktion sinnvoll verwendet wurden, den zuletzt eingestellten Wert der ersten Argumentvariablen Wird zurückgegeben.
(Edit: aber dieser "Set-Wert" muss auf bestimmte Arten gesetzt werden, zum Beispiel das Setzen einer Variablen mit
=
oder+=
funktioniert, aber das Setzen mit%=
funktioniert nicht; komisch)Dritter Versuch (27 Byte): Da ich die zweite Variable (b) auf jeden Fall sinnvoll nutzen muss, um den oben genannten Speicherfehler ordnungsgemäß zu missbrauchen, kann ich sie auch als tatsächliche Variable für "10" zum Ersetzen verwenden.
(Hinweis: Ich sollte in der Lage sein,
a=a%b
mit zu tauschena%=b
, um ein weiteres Byte zu speichern. Leider führt dies dazu, dass der oben genannte Speicherfehler nicht mehr funktioniert, sodass ich nicht mehr kann.)quelle
Retina ,
76 BytesOnline testen (alle Testfälle)
Geben Sie Übereinstimmungen einer Ziffer gefolgt von Nullen am Ende der Eingabezeichenfolge aus. Dies ist zwar nicht erforderlich, funktioniert aber auch für
0
.quelle
[1-9]
(oder[^0]
) wäre nötig statt\d
. Ich denke, die Gier von*
sorgt jedes Mal für die richtige Ausgabe.*
sondern damit, dass Übereinstimmungen von links nach rechts gesucht werden.\d0*?$
würde auch funktionieren..0*$
sollte funktionieren.0*
Cubix , 18
32BytesIch denke, ich muss später etwas Zeit dafür aufwenden und sehen, ob ich es ein bisschen komprimieren kann. Aber für den Moment ist es hier.Es stellte sich heraus, dass ich völlig falsch darüber nachdachte. Jetzt wendet der Prozess inkrementell einen Mod (1,10,100,1000, ...) auf die eingegebene Ganzzahl an und gibt die erste aus, die nicht Null ist. Etwas langweiliger, aber kürzer.
Probieren Sie es hier aus
quelle
JavaScript, 21 Bytes
Testfälle
Code-Snippet anzeigen
quelle
Javascript
1918 BytesDank an ETHproductions für das Golfen ab einem Byte und Patrick Roberts für das Golfen ab zwei Byte
Gibt ein Array von Zeichenfolgen zurück, die dem regulären Ausdruck am Ende der Eingabezeichenfolge mit einem beliebigen Zeichen gefolgt von der größtmöglichen Anzahl von Nullen entsprechen.
Probieren Sie es online
quelle
g
, da es immer nur einen Treffer gibt.x=>x.match`.0*$`
Bash + Coreutils, 12
Probieren Sie es online aus .
quelle
Schmutz , 5 Bytes
Probieren Sie es online!
Erläuterung
quelle
Brachylog , 2 Bytes
Probieren Sie es online!
Das
a₁
für Ganzzahlen eingebaute Suffix wird wie folgt implementiert:Brachylog ist gern in der Lage, Ganzzahlen als Ziffernlisten zu behandeln, und verwendet dafür das benutzerdefinierte Dienstprogramm-Prädikat
integer_value/2
. Das Interessante daraninteger_value/2
ist, dass es in der Lage sein muss, eine Ziffernliste mit führenden Nullen korrekt zu übersetzen, und dass es am Ende auch in der Lage ist, eine Ganzzahl in eine Ziffernliste mit führenden Nullen zu übersetzen, also Prädikate, die das nicht wollen Zufall (die meisten von ihnen, insbesondere die nicht-endlichen wiea
) verbieten, dass die Köpfe ihrer Ziffernlisten 0 sind. Während alsoa₁
die kürzesten Suffixe für Listen und Strings erstellt werden, überspringt es jedes Suffix einer Ganzzahl mit einer führenden 0, die in Neben dem Entfernen von Duplikaten bedeutet dies auch, dass das erste generierte Suffix die ganz rechts stehende Ziffer ungleich Null mit allen nachfolgenden Nullen ist.quelle
Brain-Flak , 74 Bytes
Probieren Sie es online!
Druckt nur die letzten Nullen und alle nachfolgenden Nullen.
Erläuterung:
quelle
Vim, 19 Bytes
Zwei Versionen, beide 19 Bytes:
Plus jeweils einen nachgestellten Wagenrücklauf.
Überprüfen Sie alle Testfälle online! (Ein Byte zum Testen in mehreren Zeilen hinzugefügt)
quelle
TI-Basic, 18 Bytes
quelle
R, 33 Bytes
Als unbenannte Funktion implementiert
Dies gilt für einen Mod von 10 ^ 0 bis 10 ^ 99.
rle
wird verwendet, um die Ergebnisse so zu reduzieren, dass das zweite Element immer das gewünschte Ergebnis ist.Probieren Sie es online!
quelle
Zsh ,
1816 BytesProbieren Sie es online!Probieren Sie es online!Bash , 25 Bytes
Probieren Sie es online!
Shells müssen externe Programme aufrufen, um Regex verwenden zu können, also müssen wir uns mit Globbing begnügen.
Die
${1%[^0]*}
Erweiterung stimmt mit dem kürzesten Suffix überein, das mit einem Zeichen ungleich Null beginnt, und entfernt es.(M)
Flags das übereinstimmende Suffix beibehalten und nicht entfernt.${1% }
verbleibende Erweiterung als Präfix entfernt.quelle
GNU sed ,
1714 + 1 (r Flag) = 15 BytesEdit: 2 Bytes weniger dank Riley
Es löscht alles bis zur am weitesten rechts stehenden Ziffer ungleich Null, die dann zusammen mit eventuell vorhandenen nachgestellten Nullen gedruckt wird. Das Skript kann mehrere Tests in einem Durchgang ausführen, die sich jeweils in einer separaten Zeile befinden.
Probieren Sie es online! (alle Testbeispiele)
quelle
Mathematica, 26 Bytes
Reine Funktion, die eine Ziffernliste aufnimmt und eine Ziffernliste ausgibt:
Erläuterung
Dies funktioniert, da es die am weitesten links liegende Übereinstimmung für findet
x
, die das am weitesten rechts liegende Nicht-Null-Element der Liste sein muss, da auf sie eine Folge von Nullen von mehr0
s und dann das Ende der Liste folgt .quelle
Java 8, 47 Bytes
Dies ist ein Lambda-Ausdruck, der zugewiesen werden kann
IntUnaryOperator
:Erklärung: Multiplizieren Sie m mit 10, bis
x%m
nicht 0return x%m*m/10
ist. Dies erfordert die Division, da m eine Größenordnung größer ist als das gewünschte Ergebnis.quelle
Perl 6 , 10 Bytes
Triviale Regex-Lösung. Eingabe und Ausgabe einer Nummer.
quelle
MATL ,
107 Bytes3 Bytes gespart dank @B. Mehta!
Ein- und Ausgabe sind ein Array von Ziffern.
Probieren Sie es online!
Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
48-
gesamten 3 Bytes sparen: Probieren Sie es online aus!C #,
3028 BytesBasierend auf dieser JavaScript-Antwort , gehen wohl alle Credits an ihn.
Golf gespielt
()
uma
dank Emignaquelle
i
damit dies funktioniert, wenn Sie die Rekursion verwenden.i
wird sie für den rekursiven Aufruf nicht deklariert).a
ist in beiden Fällen nicht erforderlich.J, 27 Bytes
Es basiert auf der Formel von xnor.
quelle
Kotlin, 49 Bytes
Lambda, zuweisbar auf
(List<Int>) -> List<Int>
it
inindexOfLast
..
zum Bauen von Bereichenquelle
Perl 5, 12 Bytes
11 plus 1 für
-nE
statt-e
quelle
05AB1E , 9 Bytes
Probieren Sie es online! oder als Testsuite
Erläuterung
quelle
Japt , 6 Bytes
Probieren Sie es online!
quelle
Stax , 5 Bytes
Führen Sie es aus und debuggen Sie es
Verfahren:
quelle
05AB1E , 4 Bytes
I / O als Ziffernliste.
Probieren Sie es online aus oder überprüfen Sie alle Testfälle (die Testsuite enthält einen Join zur besseren Lesbarkeit).
Erläuterung:
quelle
Pyke,
131110 BytesProbieren Sie es hier aus!
11 Bytes:
Probieren Sie es hier aus!
13 Bytes:
Probieren Sie es hier aus!
quelle
Haskell 57 Bytes
quelle