Dies ist eine Code-Golf-Version einer ähnlichen Frage, die ich zuvor auf dem Stack gestellt habe, aber für ein interessantes Rätsel gehalten habe.
Wenn eine Zeichenfolge mit der Länge 10 eine Zahl zur Basis 36 darstellt, erhöhen Sie diese um eins und geben Sie die resultierende Zeichenfolge zurück.
Dies bedeutet, dass die Zeichenfolgen nur Ziffern von 0
bis 9
und Buchstaben von a
bis enthalten z
.
Die Basis 36 funktioniert wie folgt:
Die am weitesten rechts stehende Ziffer wird zunächst mit 0
bis inkrementiert9
0000000000> 9 Iterationen> 0000000009
und danach wird a
to z
verwendet:
000000000a> 25 Iterationen> 000000000z
Wenn z
inkrementiert werden muss, wird die Schleife auf Null zurückgesetzt und die Ziffer links davon inkrementiert:
000000010
Weitere Regeln:
- Sie können Groß- oder Kleinbuchstaben verwenden.
- Sie dürfen keine führenden Nullen löschen. Sowohl Eingabe als auch Ausgabe sind Zeichenfolgen mit der Länge 10.
- Sie müssen nicht
zzzzzzzzzz
als Eingabe behandeln.
Testfälle:
"0000000000" -> "0000000001"
"0000000009" -> "000000000a"
"000000000z" -> "0000000010"
"123456zzzz" -> "1234570000"
"00codegolf" -> "00codegolg"
code-golf
string
base-conversion
Jack Hales
quelle
quelle
"0zzzzzzzzz"
Schlagen Sie vor, als Testfall etwas wie (Ändern der wichtigsten Ziffer) hinzuzufügen . Es hat meine C-Lösung aufgrund eines Fehler-zu-eins-Fehlers ausgelöst.Antworten:
05AB1E , 10 Bytes
Die Eingabe erfolgt in Großbuchstaben .
Code
Erläuterung
Verwendet die 05AB1E- Codierung. Probieren Sie es online! oder Überprüfen Sie alle Testfälle .
quelle
Japt , 13 Bytes
Probieren Sie es online! und Testfälle überprüfen
Übernimmt die Eingabe als Zeichenfolge
Erläuterung
quelle
JavaScript (ES6), 45 Byte
4 Bytes gespart dank @OOBalance
Probieren Sie es online!
quelle
Haskell , 58 Bytes
Probieren Sie es online!
Eine Brute-Force-Strategie: Generieren Sie alle Zeichenfolgen der Länge 10 zur Basis 36 in der angegebenen Reihenfolge und suchen Sie die Zeichenfolge, die nach der Eingabe in der Liste steht. Nehmen Sie sich viel Zeit für Zeichenfolgen, die weit vom Anfang der Liste entfernt sind.
Haskell , 60 Bytes
Probieren Sie es online!
Liest die Zeichenfolge von links nach rechts, bis sie ein Zeichen erreicht, gefolgt von einem Suffix aller Zs, die möglicherweise leer sind. Erhöht dieses Zeichen und ersetzt die Zs durch Nullen.
quelle
Stax , 7 Bytes
Führen Sie es aus und debuggen Sie es
Erläuterung:
quelle
C (GCC) ,
5048 BytesEin explizites Carry-Flag war nach der Umstrukturierung der Schleife zum Ende nicht erforderlich, sobald kein Carry stattfinden würde. Die Einstellung 9-> A wird während der Schleifenprüfung durchgeführt.
Danke an ceilingcat für den Vorschlag.
Probieren Sie es online!
Originalversion:
7157 BytesDiese Version verwendet ein Übertragsflag, um Aktualisierungen zu verbreiten: Ich habe es auf true gesetzt, um das Inkrement zu starten. Die Zeichenfolge wird direkt geändert und akzeptiert nur 0-9, AZ. Der knifflige Teil bestand darin, sicherzustellen, dass 9-> A beim Tragen richtig gehandhabt wurde.
Bearbeiten: Ich habe den Eingabezeiger als Übertragsflag neu verwendet.
Probieren Sie es online!
quelle
C
82815350 BytesÄndert die Eingabezeichenfolge direkt. Eingabe und Ausgabe erfolgt in Großbuchstaben. Probieren Sie es hier online aus . Dank an Arnauld für das Golfen von 24 Bytes und an ceilingcat für das Golfen von 3 weiteren Bytes.
Ungolfed:
quelle
ZZZZZZZZZZ
. ErikFs Antwort macht dasselbe, aber noch kürzer: codegolf.stackexchange.com/a/169468/79343Online Turing Machine Simulator , 745 Byte
Online-Dolmetscher
quelle
Perl 6 ,
34 3230 BytesDank nwellnhof für -2 Bytes durch die Verwendung des
o
Operators, um Funktionen zu kombinierenProbieren Sie es online!
Funktion, die das Argument in Basis 36 konvertiert, 1 addiert, zurückkonvertiert und dann formatiert. Verwendet jetzt dieselbe Taktik wie Adnans Antwort , um die führenden Nullen beizubehalten.
quelle
{S/.//}o{base :36(1~$_)+1: 36}
für 30 Bytes.o
Golf zu spielen, aber ich kann sehen, wo es nützlich sein könnte!.succ
(inkrementieren um eins) nicht funktioniertMATL , 12 Bytes
Probieren Sie es online!
quelle
Haskell , 63 Bytes
Probieren Sie es online! Kehrt die Zeichenfolge um und überprüft das erste Zeichen:
9
wird durch ein ersetzta
.z
wird durch a ersetzt0
und rekursiv das nächste Zeichen geprüft.succ
der Nachfolgerfunktion inkrementiert , die für Zeichen verwendet werden kann, da sie eine Instanz der Enum-Klasse sind .Schließlich wird die resultierende Zeichenfolge wieder umgekehrt.
quelle
6502 (NMOS *) Maschinencode- Routine, 26 Bytes
*) verwendet einen "illegalen" Opcode
ISB
/0xF3
, funktioniert auf allen Original-NMOS 6502-Chips, nicht auf späteren CMOS-Varianten.Erwartet einen Zeiger auf eine 10-stellige Zeichenfolge in
$fb
/, bei$fc
der es sich voraussichtlich um eine Zahl zur Basis 36 handelt. Erhöht diese Nummer an Ort und Stelle.Macht bei ungültigen Eingaben (wie zB einer kürzeren Zeichenkette) nichts Sinnvolles - handhabt versehentlich
ZZZZZZZZZZ
"richtig";)Kommentierte Demontage
Beispiel C64 Assembler Programm mit der Routine:
Online-Demo
Code in ca65- Syntax:
quelle
Retina 0.8.2 , 12 Bytes
Probieren Sie es online! Erläuterung: Der
dl
Teil des Ersetzungsziels wird erweitert,0-9a-z
während der Teilo
an die Quelle kopiert wird, was dazu führtz0-9a-z
(obwohl der zweite Teilz
ignoriert wird, da er niemals übereinstimmen kann). Dies erhöht die übereinstimmenden Ziffern. Der.z*$
Teil des Musters stimmt mit der letzten Nicht-z
Ziffer plus allen nachfolgenden Zeichen übereinz
, wodurch der Übertrag von ihrem Inkrement bis behandelt wird0
.quelle
Ruby , 40 Bytes
Probieren Sie es online!
0
s"zzzzzzzzzz"
Gibt eine 11-lange Zeichenfolge zurückquelle
Brainfuck , 109 Bytes
Probieren Sie es online!
quelle
Apl (Dyalog Unicode) ,
302824 BytesDanke an ngn für den Hinweis, einige Bytes zu sparen.
Probieren Sie es online!
Benötigt ⎕IO von 0
Verwendet Großbuchstaben
quelle
'1',
Teil davon werdenf
? dann1↓
wird ein Teil seiner inversen worden(⎕D,⎕A)⍳'1',
->1,(⎕D,⎕A)⍳
(f⍣¯1)1+f←36⊥1,(⎕D,⎕A)⍳⊢
PHP,
6964 Byteslahme Version :
Als Rohr mit laufen lassen
-R
. Eingabe unabhängig von Groß- / Kleinschreibung, Ausgabe in Kleinbuchstaben.erster Ansatz, 69 Bytes:
Als Rohr mit laufen lassen
-F
Loop-Version, auch 69 Bytes :
jüngeres PHP gibt Warnungen für undefinierte Konstanten aus.
Y
undA
durch Kleinbuchstaben für die Eingabe von Kleinbuchstaben.Als Rohr mit laufen lassen
-nR
... oder online ausprobieren .
quelle
-R
und dieses 66 Bytes nennen.printf('%010s',($b=base_convert)(1+$b($argn,36,10),10,36));
- 59 Bytes($b=base_convert)(a,b,c)
. Ich lerne viel von dir.Python 2 , 88 Bytes
Probieren Sie es online!
Erhöht die Zeichenfolge "von Hand".
quelle
Holzkohle , 14 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
9
0
s drucken . Dies dient zum Auffüllen des Ergebnisses.Konvertieren Sie die Eingabe von der Basis 36, inkrementieren Sie sie und konvertieren Sie sie dann zurück zur Basis 36. Kehren Sie dann das Ergebnis um und drucken Sie es nach links.
quelle
Java 8,
907656 BytesAkzeptiert sowohl Groß- als auch Kleinbuchstaben für die Eingabe. Die Ausgabe erfolgt immer in Kleinbuchstaben.
Danke an Okx für das Golfen mit 18 Bytes.
Probieren Sie es hier online aus .
Ungolfed:
quelle
"".format("%10s",t).replace(' ','0')
1
am Anfang hinzuzufügen, als es zu entfernen:s->Long.toString(Long.valueOf("1"+s,36)+1,36).substring(1)
"1"+s
=>1+s
JavaScript (ES6), 89 Byte
Dieser ist bei weitem nicht so byteeffizient wie der andere JavaScript-Eintrag , aber ich habe das gemacht, ohne die folgende Regel zu beachten:
Das ist also kein ernstzunehmender Eintrag - nur zum Spaß! Es funktioniert mit Zeichenfolgen allgemeiner Länge, wie z . B. ->
0abc
, und es wird ein vorangestellt,1
wenn die erste Zifferz
z . B.zzz
-> ist1000
. Die Eingabe muss in Kleinbuchstaben erfolgen.Erläuterung
Der Ausdruck
(A, B, C)
bedeutet tatsächlich "mache A, dann mache B, dann gebe C zurück", mit dem ich einige Variablen deklariere, die ich im Code wiederverwende.s
steht für "string",l
bedeutet "last",r
bedeutet "rest".Dies ist eine rekursive Funktion. Bei einer typischen Zeichenfolge
aza
wird nur das letzte Zeichen erhöht (siehe Zeile 6)azb
. Aber für eine Zeichenkette, die mit endetz
,h0gz
wird sie sich bis zum letzten Zeichen (thez
) selbst abarbeiten und stattdessen a einsetzen0
(siehe Zeile 5) -f(h0gz)
=f(h0g) + 0
=h0h0
.Die
||'0'
in Zeile 5 ist so, dass die Funktion funktioniert, wenn sie für eine Zeichenfolge mit einer Länge von 1 (dh die Zeichenfolge'z'
) aufgerufen wird . Ohne esf('')
heißt (da'z'.slice(0, -1)
ist''
), was undefiniertes Verhalten hat (buchstäblich - probiere es selbst aus), und das ist nicht gut. Das erwartete Ergebnis vonf('z')
ist'10'
, was wir bekommenf('0') + 0
, also verwenden wir||'0'
. ( Dies||'0'
ist besonders nützlich, weil es nicht den üblichen Fall beeinträchtigt -r
mindestens 1 Länge (s
mindestens 2 Länge) - weil Zeichenfolgen nur dann falsch sind, wenn sie 0 Länge haben.)Die Methode zum Inkrementieren eines Strings ist die gleiche wie im anderen JS-Eintrag: Konvertieren Sie die "Zahl" der Basis 36 in eine tatsächliche Zahl, addieren Sie 1 und konvertieren Sie sie dann zurück in die Basis 36. Wir brauchen uns keine Gedanken über das
1
Inkrementieren von 'z' ('z'
->'10'
) zu machen, da wir 'z' eigentlich nie inkrementieren (siehe Zeile 4 und 6: Das letzte Zeichen wird nur inkrementiert, wenn es nicht 'z' ist).Außerdem riskieren wir niemals, führende Nullen zu verwerfen, da wir nie mehr als ein einzelnes Zeichen gleichzeitig manipulieren - immer nur das letzte Zeichen in der Zeichenfolge. Der Rest der Zeichen wird sauber abgetrennt, wenn Sie eine Zeichenfolge und vorangestellte Nachwörter aufschneiden.
quelle
Sauber ,
8984 BytesProbieren Sie es online!
Eine kürzere Lösung dank Laikoni .
Sauber , 115 Bytes
Ich liebe es, wenn ich es benutzen darf
limit(iterate...
Probieren Sie es online!
Erzeugt die Antwort ohne Konvertierung der Basen mittels Listenabgleich.
? :: [Char] -> [Char]
führt vorwärts tragen.@ :: Char -> Char
Inkremente um eins, unter Berücksichtigung der Lücke zwischen'9'
und'z'
.$ :: [Char] -> [Char]
erhöht das letzte Zeichen und wird angewendet,?
bis sich der Wert stabilisiert.quelle
R ,
152123 BytesProbieren Sie es online!
Ein ganz anderer Ansatz. Holen Sie sich die ASCII-Codepunkte und "erhöhen" Sie rekursiv den am weitesten rechts stehenden Codepunkt (wobei
0
(57) zua
(97) undz
(122) zu0
(48) zurückspringt, bis Sie keinez
s mehr haben. Zurück in String konvertieren.Alte Version
Probieren Sie es online!
Dies ist alles eine Textmanipulation, die nicht mit R-Code-Golfen einhergeht.
Ersetzen Sie alle
z
am Ende der Zeichenfolgen mit0
. Suchen Sie die Position des letzten Elements vor dem neu geprägten abschließenden0
s. Suchen Sie die nächste 36-stellige Basis. Mach die Veränderung. Seien Sie froh, die Online Turing Machine Simulator-Lösung kaum geschlagen zu haben.quelle
strtoi
Ihnen den Einstieg erleichtern. Es gibt ein paar weitere Golf-Tricks, um es auf 72 zu bringen.strtoi
ist allerdings auf eher kleine zahlen beschränkt? Ich habe es vor einer Weile aufgegeben.int
Einschränkung war so problematisch. Schade! Für die Nachwelt war dies meine gescheiterte Lösung: Probieren Sie es online!Sternenklar , 325 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Wolfram Language (Mathematica) , 39 Byte
Probieren Sie es online!
quelle
Python 3.6+ und gmpy2 , 62 Bytes
Probieren Sie es online!
(Beachten Sie, dass gmpy2 nicht Teil der Python-Standardbibliothek ist und eine separate Installation erfordert.)
quelle
f=
. Anonyme Funktionen gelten normalerweise als im Code Golf zu finden.Pyke , 11 Bytes
Probieren Sie es hier aus!
Könnte mit der folgenden Sprachänderung 2 Byte kürzer sein: Wenn der Hex-Modus verwendet wird, ändern Sie alle base_36- und base_10-Verwendungen in base_92 (was in diesem Kontext ohnehin nicht wirklich base 92 ist).
quelle
sed , 94 bytes
Probieren Sie es online!
Sed leidet sehr darunter, dass er die Charaktere durch Nachschlagen ändern muss.
quelle
Zsh ,
4136 BytesProbieren Sie es online!
quelle
Jelly , 21 Bytes
Probieren Sie es online!
Verwendet Großbuchstaben. TIO-Link ermöglicht auch Klein- / Mischschreibung.
quelle