Contexte
Une numération b de base bijective , où b est un entier positif, est une notation positionnelle bijective qui utilise des symboles b avec des valeurs associées de 1 à b .
Contrairement à son homologue non bijectif, aucun symbole n'a une valeur de 0 . De cette façon, chaque entier non négatif n a une représentation unique dans la base bijective b .
Les numérotations bijectives populaires incluent la base unaire, bijective 2 (utilisée dans le codage de longueur de bzip2 ) et la base bijective 26 (utilisée pour numéroter les colonnes dans les feuilles de calcul).
Définition
Dans ce défi, nous définissons l'ensemble M de symboles comme
123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz<=>
et une fonction i de M au nombre naturel tel que i ('1') = 1,…, i ('>') = 64 .
Etant donné une base b comprise entre 1 et 64 (tous deux inclus), nous définissons que chaque entier non négatif n correspond à la chaîne a k … a 0 , constituée de symboles de M , tels que n = b k i (a k ) + … + B 0 i (a 0 ) .
Cette correspondance est bien définie et bijective. Puisqu'une somme vide est définie comme 0 , l'entier 0 peut être codé comme une chaîne vide.
Tâche
Acceptez trois chaînes en entrée:
Une base d'entrée b comprise entre 1 et 64 , codée comme une chaîne de base bijective 64 .
Un entier non négatif n , codé comme une chaîne b de base bijective .
Une base de sortie B entre 1 et 64 , codée comme une chaîne de base bijective 64 .
Compte tenu de ces trois entrées, codez n comme une chaîne B de base bijective .
Cas de test
Tous les tests indiquent l'entrée dans l'ordre 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"
Règles
Vous pouvez lire les trois chaînes dans n'importe quel ordre approprié, comme tel, un tableau de chaînes, une représentation de chaîne de celles-ci, concaténées ou séparées par des délimiteurs à caractère unique de votre choix.
Si vous choisissez d'imprimer la sortie sur STDOUT, vous ne pouvez imprimer que les symboles et (éventuellement) une nouvelle ligne de fin.
Les intégrations de conversion de base de toutes sortes sont autorisées.
Les règles de code-golf standard s'appliquent.
la source
Pip,
848078 octetsDépôt GitHub pour Pip
Algorithmes adaptés de l'article Wikipédia. Voici l'explication d'une version antérieure légèrement non golfée:
Exemple d'exécution:
la source
Octave, 166 octets
Version multiligne:
Plutôt que de créer une carte pour convertir un caractère en une valeur d'index, je viens de créer la table de recherche inverse
N
pour les valeurs ascii1..'z'
et de la remplir avec les indices aux valeurs appropriées.polyval
évalue l'équationen utilisant la valeur d'entrée convertie décimale comme vecteur de coefficients
c
et la base d'origine commex
. (Malheureusement, Octavebase2dec()
rejette les symboles hors de la plage normale.)Une fois que nous avons la valeur d'entrée dans la base 10, le calcul de la valeur dans la nouvelle base est simple.
Pilote de test:
Résultats:
la source
Perl,
261248229 octetsmulti-lignes, alors que les boucles ne sont pas golfées:
t
est une fonction pour analyser un nombre à partir d'une chaîne de base bijective d'une base donnée.r
est une fonction pour générer une chaîne de base bijective d'une base donnée à partir d'un nombre. Les 3 paramètres séparés par des virgules sont analysés depuis stdin et les fonctions sont appelées selon les besoins.La conversion d'un nombre positif en une chaîne de base bijective est similaire à une base normale. Cependant, où vous feriez quelque chose comme ça pour une base normale:
vous ajustez le mod pour donner une plage de 1 à la base au lieu de 0 à la base - 1:
la source
Python 2, ...
317307298311 octetsCertainement golfable. Je déteste vraiment la façon dont les chaînes n'ont pas d'attribution d'élément et les listes n'ont pas
find
. Je vais chercher un meilleur moyen que ma solution rapide que j'ai maintenant.Ma méthode consiste à convertir l'entrée en nombre décimal, puis en base de sortie, puis de convertir cela en base bijective.
Edit : Trouvé que mon programme ne fonctionnait pas lors de la conversion en Unary. Il en coûte 13 octets pour réparer
e=F(o)<2
, etc.Essayez-le ici
la source
.index()
méthode. Pourquoi ne pas utiliser cela au lieu de trouver? De plus, au lieu d'enregistrerF(b)
etF(o)
dans les variables, vous ne les utilisez qu'une seule fois, il vous suffit donc de les sous-insérer là où cela est nécessaire. Enfin,'n'[2::5]
est plus court que''.join(n)
(remplacer les apostrophes pour les contre-coups).Python 2, 167 octets
Pas vraiment de trucs spéciaux ici, à part le
[2::5]
découpage pour obtenir le jeu de caractères à un nombre d'octets inférieur.Tests:
la source
CJam,
737069555148 octetsLa dernière version utilise l'opérateur de conversion de base CJam pour la conversion à partir de la base source, à laquelle je n'avais pas pensé avant d'avoir vu la solution de @ aditsu. Il applique également une astuce récente de @Dennis pour la construction de la chaîne "digit" ( /codegolf//a/54348/32852 ), ainsi que d'autres idées partagées sur le chat.
Le format d'entrée est la valeur, suivie de la base source et destination, chacune d'elles sur une ligne distincte. Pour la chaîne vide, laissez la première ligne vide. Exemple d'entrée:
Essayez-le en ligne
Explication:
la source
Gelée , 22 octets
Essayez-le en ligne!
la source