Einführung
Wir haben hier in der Vergangenheit einige grundlegende Konvertierungsprobleme, aber nicht viele, die darauf ausgelegt sind, Zahlen beliebiger Länge (dh Zahlen, die lang genug sind, dass sie den Datentyp Integer überlaufen) zu bewältigen, und die meisten davon fühlten sich ein wenig kompliziert. Ich bin neugierig, wie sich eine Änderung des Basiscodes auswirken kann.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion in der Sprache Ihrer Wahl, die eine Zeichenfolge einer Basis in eine Zeichenfolge einer anderen Basis konvertieren kann. Die Eingabe sollte aus der umzusetzenden Zahl (Zeichenfolge), der Basis (Basis-10-Zahl), der Basis (Basis-10-Zahl) und dem Zeichensatz (Zeichenfolge) bestehen. Die Ausgabe sollte die konvertierte Zahl (Zeichenfolge) sein.
Einige weitere Details und Regeln lauten wie folgt:
- Die zu konvertierende Zahl ist eine nicht negative ganze Zahl (seit
-
und.
möglicherweise im Zeichensatz enthalten). So wird auch die Ausgabe sein. - Führende Nullen (das erste Zeichen im Zeichensatz) sollten abgeschnitten werden. Wenn das Ergebnis Null ist, sollte eine einzelne Nullstelle verbleiben.
- Der minimal unterstützte Basisbereich liegt zwischen 2 und 95 und besteht aus den druckbaren ASCII-Zeichen.
- Die Eingabe für die zu konvertierende Zahl, der Zeichensatz und die Ausgabe müssen alle vom Datentyp string sein. Die Basen müssen vom Integer-Datentyp base-10 (oder Integer-Floats) sein.
- Die Länge der eingegebenen Zahlenfolge kann sehr groß sein. Es ist schwer, ein vernünftiges Minimum zu quantifizieren, aber erwarten Sie, dass es in der Lage ist, mindestens 1000 Zeichen zu verarbeiten und 100 Zeichen in weniger als 10 Sekunden auf einem anständigen Computer einzugeben (sehr großzügig für diese Art von Problem, aber ich möchte nicht Geschwindigkeit im Mittelpunkt stehen).
- Sie können keine integrierten Funktionen zum Ändern der Basis verwenden.
- Die Zeichensatzeingabe kann in beliebiger Anordnung erfolgen, nicht nur die typischen 0-9a-z ... etc.
- Es sei angenommen, dass nur gültige Eingaben verwendet werden. Sorgen Sie sich nicht um Fehlerbehandlung.
Der Gewinner wird anhand des kürzesten Codes ermittelt, der die Kriterien erfüllt. Sie werden in mindestens 7 Basis-10-Tagen ausgewählt, oder wenn / wenn es genügend Einreichungen gegeben hat. Bei einem Unentschieden gewinnt der Code, der schneller läuft. Wenn die Geschwindigkeit / Leistung nahe genug ist, gewinnt die Antwort, die früher kam.
Beispiele
Hier sind einige Beispiele für Ein- und Ausgaben, die Ihr Code verarbeiten sollte:
F("1010101", 2, 10, "0123456789")
> 85
F("0001010101", 2, 10, "0123456789")
> 85
F("85", 10, 2, "0123456789")
> 1010101
F("1010101", 10, 2, "0123456789")
> 11110110100110110101
F("bababab", 2, 10, "abcdefghij")
> if
F("10", 3, 2, "0123456789")
> 11
F("<('.'<)(v'.'v)(>'.'>)(^'.'^)", 31, 2, "~!@#$%^v&*()_+-=`[]{}|';:,./<>? ")
> !!~~~~~~~!!!~!~~!!!!!!!!!~~!!~!!!!!!~~!~!~!!!~!~!~!!~~!!!~!~~!!~!!~~!~!!~~!!~!~!!!~~~~!!!!!!!!!!!!~!!~!~!~~~~!~~~~!~~~~~!~~!!~~~!~!~!!!~!~~
F("~~~~~~~~~~", 31, 2, "~!@#$%^v&*()_+-=`[]{}|';:,./<>? ")
> ~
F("9876543210123456789", 10, 36, "0123456789abcdefghijklmnopqrstuvwxyz")
> 231ceddo6msr9
F("ALLYOURBASEAREBELONGTOUS", 62, 10, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
> 6173180047113843154028210391227718305282902
F("howmuchwoodcouldawoodchuckchuckifawoodchuckcouldchuckwood", 36, 95, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_-+=[{]}\\|;:'\",<.>/? ")
> o3K9e(r_lgal0$;?w0[`<$n~</SUk(r#9W@."0&}_2?[n
F("1100111100011010101010101011001111011010101101001111101000000001010010100101111110000010001001111100000001011000000001001101110101", 2, 95, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_-+=[{]}\\|;:'\",<.>/? ")
> this is much shorter
You cannot use built in change-of-base functions to convert the entire input string/number at once
? Konnte ich ein eingebautes verwenden, um den Eingang in eine Zwischenbasis umzuwandeln? Kann ich dann ein eingebautes verwenden, um auf die Zielbasis zu konvertieren? Möchten Sie etwasconvert input with canonical form for given base; convert to base 10; convert to target base; convert back to specified character set with string replacement
?Antworten:
CJam, 34 Bytes
Das Eingabeformat steht
input_N alphabet input_B output_B
jeweils in einer eigenen Zeile.Führen Sie alle Testfälle aus.
Erläuterung
Dies funktioniert für die gleiche Anzahl von Bytes:
Der einzige Unterschied besteht darin, dass wir eine Zeichenfolge aufbauen, anstatt alles auf dem Stapel zu sammeln und umzukehren.
quelle
Python 2 ,
11511410610594 BytesGolfvorschläge sind willkommen. Probieren Sie es online!
Edit: -9 Bytes dank mbomb007. -2 Bytes dank FlipTack.
Ungolfed:
quelle
while z:s=d[z%t]+s;z/=t
spart 9 Bytes.z=0
unds=''
in die Funktionsdeklaration setzen, um Bytes zu sparen.print
anstelle vonreturn
ist standardmäßig zulässig .Im Ernst, 50 Bytes
Hex Dump:
Ich bin stolz auf diese trotz ihrer Länge. Warum? Weil es beim zweiten Versuch perfekt geklappt hat. Ich schrieb es und debuggte es in buchstäblich 10 Minuten. Normalerweise ist das Debuggen eines Seriously-Programms eine Stunde Arbeit.
Erläuterung:
quelle
C (Funktion) mit GMP-Bibliothek , 260
Dies stellte sich länger heraus als ich gehofft hatte, aber hier ist es trotzdem. Das
mpz_*
Zeug frisst wirklich viele Bytes. Ich habe es versucht#define M(x) mpz_##x
, aber das ergab einen Nettogewinn von 10 Bytes.Die Funktion
F()
ist der Einstiegspunkt. Es konvertiert die Eingabezeichenfolge in einempz_t
Folge von Multiplikationen mit derfrom
Basis und fügt den Index der angegebenen Ziffer in die Ziffernliste ein.Die Funktion
O()
ist eine rekursive Ausgabefunktion. Jede Rekursion teilt diempz_t
durch dieto
-base. Da dies die ausgegebenen Ziffern in umgekehrter Reihenfolge ergibt, können die Ziffern durch die Rekursion effektiv auf dem Stapel gespeichert und in der richtigen Reihenfolge ausgegeben werden.Testfahrer:
Zeilenumbrüche und Einrückungen zur besseren Lesbarkeit hinzugefügt.
quelle
JavaScript (ES6), 140 Byte
Im Gegensatz zum Code von @ Mwr247 (der die Basis-f-Arithmetik verwendet, um s jedes Mal durch t zu dividieren und jeden Rest zu sammeln, während er geht) verwende ich die Basis-t-Arithmetik, um die Antwort jedes Mal mit f zu multiplizieren und dabei jede Ziffer von s zu addieren.
Ungolfed:
quelle
Ruby,
11311210598979587 BytesIch habe meine Python-Antwort (irgendwie) doppelt gepostet, also hier eine Ruby-Antwort. Sieben weitere Bytes dank manatwork , ein weiteres Byte dank Martin Büttner und 8 weitere Bytes dank cia_rana .
Ungolfed:
quelle
s=d[z%t]+s;z/=t
statt zu verwendenz,m=z.divmod t;s=d[m]+s
?APL, 10 Bytes
Dies ist ein APL-Operator. In APL werden
⍵
und⍺
zum Übergeben von Werten verwendet, während⍵⍵
und⍺⍺
normalerweise zum Übergeben von Funktionen verwendet werden. Ich missbrauche dies hier, um 3 Argumente zu haben.⍺⍺
ist das linke Argument,⍵⍵
ist das "innere" rechte Argument und⍵
ist das "äußere" rechte Argument.Grundsätzlich:
⍺(⍺⍺{...}⍵⍵)⍵
Dann brauchen wir nur noch
⍳
noch die Positionen der Eingabezeichenfolge in der "from" -Tabelle finden und dann[]
mit diesen Positionen in die "to" -Tabelle indexieren.Beispiel:
quelle
JavaScript (ES6), 175 Byte
Ich dachte, es ist lange genug her, dass ich das einreichen kann, das ich gemacht habe, um die Beispiele zu erstellen. Vielleicht versuche ich es später ein bisschen besser.
quelle
Japt, 9 Bytes
Versuch es
quelle