Hintergrund
Eine bijektive Basis- b- Nummerierung , wobei b eine positive ganze Zahl ist, ist eine bijektive Positionsnotation, die b- Symbole mit zugeordneten Werten von 1 bis b verwendet .
Im Gegensatz zu seinem nicht-bijektiven Gegenstück hat kein Symbol den Wert 0 . Auf diese Weise hat jede nicht negative ganze Zahl n eine eindeutige Darstellung in der bijektiven Basis b .
Zu den gängigen bijektiven Numerierungen gehören die unäre bijektive Basis 2 (die in der Lauflängencodierung von bzip2 verwendet wird ) und die bijektive Basis 26 (die zum Nummerieren von Spalten in Tabellen verwendet wird).
Definition
In dieser Herausforderung definieren wir die Menge M von Symbolen als
123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz<=>
und eine Funktion i von M zu der natürlichen Zahl, so dass i ('1') = 1,…, i ('>') = 64 .
Bei einer Basis b zwischen 1 und 64 (beide inklusive) definieren wir, dass jede nicht negative ganze Zahl n der Zeichenkette a k … a 0 entspricht , die aus Symbolen von M besteht , so dass n = b k i (a k ) + ist … + B 0 i (a 0 ) .
Diese Entsprechung ist klar definiert und bijektiv. Da eine leere Summe als 0 definiert ist , kann die Ganzzahl 0 als leere Zeichenfolge codiert werden.
Aufgabe
Akzeptiere drei Zeichenketten als Eingabe:
Eine Eingabebasis b zwischen 1 und 64 , codiert als bijektive Basis 64- Zeichenfolge.
Eine nicht negative ganze Zahl n , die als bijektive Basis b codiert ist .
Eine Ausgangsbasis B zwischen 1 und 64 , codiert als bijektive Basis 64- Zeichenfolge.
Codieren Sie bei diesen drei Eingaben n als bijektiven Basis- B- String.
Testfälle
Alle Testfälle spezifizieren die Eingabe in der Reihenfolge , b , n , B .
Input: "4" "" "8"
Output: ""
Input: "A" "16" "2"
Output: "1112"
Input: "2" "122" "A"
Output: "A"
Input: "3" "31" "1"
Output: "1111111111"
Input: ">" "Fe" "a"
Output: "RS"
Regeln
Sie können die drei Zeichenfolgen in beliebiger Reihenfolge lesen, z. B. als Array von Zeichenfolgen, als Zeichenfolgendarstellung, verkettet oder durch Trennzeichen Ihrer Wahl getrennt.
Wenn Sie die Ausgabe auf STDOUT drucken möchten, können Sie nur die Symbole und (optional) eine nachgestellte Newline drucken.
Grundkonvertierungs-Built-Ins aller Art sind erlaubt.
Es gelten die Standardregeln für Code-Golf .
quelle
Pip,
848078 BytesGitHub-Repository für Pip
Algorithmen aus dem Wikipedia-Artikel angepasst. Hier ist die Erklärung für eine etwas ungolfed frühere Version:
Probelauf:
quelle
Oktave, 166 Bytes
Mehrzeilige Version:
Anstatt eine Map zum Konvertieren eines Zeichens in einen Indexwert zu erstellen, habe ich gerade die inverse Lookup-Tabelle
N
für ASCII-Werte erstellt1..'z'
und sie mit den Indizes an den entsprechenden Werten gefüllt.polyval
wertet die Gleichung ausVerwenden des dezimal konvertierten Eingabewerts als Koeffizientenvektor
c
und der ursprünglichen Basis alsx
. (Leider weist Octavebase2dec()
Symbole außerhalb des normalen Bereichs zurück.)Sobald wir den Eingabewert in Basis 10 haben, ist die Berechnung des Werts in der neuen Basis einfach.
Testfahrer:
Ergebnisse:
quelle
Perl,
261248229 Bytesmehrzeilig, während Loops ungolfed:
t
ist eine Funktion zum Parsen einer Zahl aus einer bijektiven Basiszeichenfolge einer gegebenen Basis.r
ist eine Funktion zum Erzeugen einer bijektiven Basiszeichenfolge einer gegebenen Basis aus einer Zahl. Die 3 durch Kommas getrennten Parameter werden von stdin analysiert und die Funktionen werden nach Bedarf aufgerufen.Das Umwandeln einer positiven Zahl in eine bijektive Basiszeichenfolge ähnelt einer normalen Basis. Aber wo würden Sie so etwas für eine normale Basis tun:
Sie passen den Mod so an, dass er einen Bereich von 1 bis zur Basis anstelle von 0 bis zur Basis - 1 angibt:
quelle
Python 2, ...
317307298311 BytesAuf jeden Fall golfen. Ich hasse es wirklich, wenn Strings keine Itemzuordnung haben und Listen keine
find
. Ich werde nach einem besseren Weg Ausschau halten als nach meiner schnellen Lösung, die ich jetzt habe.Meine Methode besteht darin, die Eingabe in eine Dezimalzahl und dann in die Ausgabebasis umzuwandeln und diese dann in die bijektive Basis umzuwandeln.
Bearbeiten : Ich habe festgestellt, dass mein Programm beim Konvertieren nach Unary nicht funktioniert hat. Das Reparieren mit
e=F(o)<2
usw. kostet 13 Bytes .Probieren Sie es hier aus
quelle
.index()
Methode .. Warum nicht verwenden, anstatt zu finden? Anstatt sie zu speichernF(b)
undF(o)
Variablen zuzuweisen, verwenden Sie sie nur einmal und reichen sie bei Bedarf ein. Schließlich'n'[2::5]
ist kürzer als''.join(n)
(ersetzen Sie Apostrophe für Backticks).Python 2, 167 Bytes
Hier gibt es wirklich keine besonderen Tricks, außer das
[2::5]
Aufteilen, um den Zeichensatz mit einer niedrigeren Byteanzahl zu erhalten.Tests:
quelle
CJam,
737069555148 BytesDie neueste Version verwendet den CJam Base-Konvertierungsoperator für die Konvertierung von der Quellbasis, an die ich erst gedacht hatte, als ich @ aditsus Lösung sah. Es wird auch ein neuer Tipp von @Dennis für die Erstellung der Zeichenfolge "digit" ( https://codegolf.stackexchange.com/a/54348/32852 ) sowie einige andere im Chat geteilte Ideen verwendet.
Das Eingabeformat ist der Wert, gefolgt von der Quell- und Zielbasis, wobei sich jede in einer separaten Zeile befindet. Lassen Sie für die leere Zeichenfolge die erste Zeile leer. Beispiel Eingabe:
Probieren Sie es online aus
Erläuterung:
quelle
Jelly , 22 Bytes
Probieren Sie es online!
quelle