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 etwas convert input with canonical form for given base; convert to base 10; convert to target base; convert back to specified character set with string replacement
?