Erstellen Sie eine Routine, die ein Array von Blöcken in einem numerischen Basissystem verwendet, und konvertieren Sie sie in ein Array von Blöcken in einem anderen numerischen Basissystem. Sowohl das Von- als auch das Bis-System sind beliebig und sollten als Parameter akzeptiert werden. Das Eingabearray kann eine beliebige Länge haben (Wenn eine Sprache verwendet wird, in der keine Arraylängen mit dem Array gespeichert sind, z. B. C, sollte ein Längenparameter an die Funktion übergeben werden).
So sollte es funktionieren:
fromArray = [1, 1]
fromBase = 256
toBase = 16
result = convertBase(fromArray, fromBase, toBase);
Welche sollten zurückkehren [0, 1, 0, 1]
oder möglicherweise [1, 0, 1]
(führende 0
s sind optional, da sie den Wert der Antwort nicht ändern).
Hier sind einige Testvektoren:
Identitätstestvektor
fromArray = [1, 2, 3, 4] fromBase = 16 toBase = 16 result = [1, 2, 3, 4]
Trivialer Testvektor
fromArray = [1, 0] fromBase = 10 toBase = 100 result = [10]
Großer Testvektor
fromArray = [41, 15, 156, 123, 254, 156, 141, 2, 24] fromBase = 256 toBase = 16 result = [2, 9, 0, 15, 9, 12, 7, 11, 15, 14, 9, 12, 8, 13, 0, 2, 1, 8]
Wirklich großer Testvektor
fromArray = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] fromBase = 2 toBase = 10 result = [1, 2, 3, 7, 9, 4, 0, 0, 3, 9, 2, 8, 5, 3, 8, 0, 2, 7, 4, 8, 9, 9, 1, 2, 4, 2, 2, 3]
Ungleichmäßiger Basisvektor
fromArray = [41, 42, 43] fromBase = 256 toBase = 36 result = [1, 21, 29, 22, 3]
Andere Kriterien / Regeln:
Alle ganzzahligen Variablen sollten für alle vernünftigen Eingabebereiche in eine standardmäßige 32-Bit-Ganzzahl mit Vorzeichen passen.
Sie können in eine Zwischendarstellung konvertieren, solange der Vermittler nur ein Array von 32-Bit-Ganzzahlen mit Vorzeichen ist.
Erwarten Sie, Basen von 2 bis 256 zu handhaben. Es besteht keine Notwendigkeit, höhere Basen als diese zu unterstützen (aber wenn Sie möchten, auf jeden Fall).
Erwarten Sie Eingangs- und Ausgangsgrößen von mindestens bis zu 1000 Elementen. Eine Lösung, die auf 2 ^ 32-1 Elemente skaliert, wäre besser, aber 1000 ist in Ordnung.
Hier geht es nicht unbedingt darum, den kürzesten Code zu haben, der diese Regeln erfüllt. Es geht darum, den saubersten und elegantesten Code zu haben.
Nun, das ist nicht gerade trivial, also könnte eine Antwort, die fast funktioniert, akzeptiert werden!
quelle
Antworten:
Python
quelle
Hier ist eine Haskell-Lösung
Und die Tests aus der Frage ausführen:
quelle
R.
Behandelt viele tausend Elemente * in weniger als einer Minute.
* Für> 500 Elemente müssen Sie die Standardrekursionsstufe erhöhen oder die
mm
Matrix nicht zurücksetzendothelocomotion()
Beispiele:
quelle
Eine weniger verschleierte und schnellere JavaScript-Version:
Die Rechenzeit wächst mit o (Anzahl der Ziffern 2 ).
Nicht sehr effizient für große Zahlen.
Spezialisierte Versionen Line Base64-Codierung nutzen Basisverhältnisse, um die Berechnungen zu beschleunigen.
quelle
Javascript
Vielen Dank an Keith Randall für Ihre Python-Antwort. Ich hatte Probleme mit den Details meiner Lösung und kopierte schließlich Ihre Logik. Wenn jemand eine Stimme für diese Lösung abgibt, weil sie funktioniert, geben Sie bitte auch eine Stimme für die Lösung von Keith.
Tests
Dies könnte wahrscheinlich stark geschrumpft sein, aber ich möchte es tatsächlich für ein kleines Nebenprojekt verwenden. Also habe ich es (etwas) lesbar gehalten und versucht, Variablen in Schach zu halten.
quelle
for each
Anweisungen und atemberaubende Konstrukte wied.length||e?d.push(e):0
... Ist dies eine verschleierte Code-Herausforderung oder so? Sie könnten dasselbe mit einer verständlichen Syntax und besseren Leistungen schreiben.Mathematica
Keine Variablen definiert, keine Eingabe akzeptiert, solange sie in den Speicher passt.
Probefahrt:
aus
quelle
Scala:
Testcode mit Tests:
Alle Tests bestanden.
quelle
J,
109105Behandelt Tausende von Ziffern ohne Schweiß. Keine ganzen Zahlen verletzt!
Beispiele
Es wird kürzer.
quelle
Smalltalk, 128
Tests:
und für Ihre besondere Unterhaltung ( Herausforderung: Finden Sie heraus, was am Eingabewert so besonders ist ):
quelle