introduction
Nous avons eu quelques défis de conversion de base ici dans le passé, mais pas beaucoup conçus pour s'attaquer aux nombres de longueur arbitraire (c'est-à-dire, les nombres suffisamment longs pour dépasser le type de données entier), et parmi ceux-ci, la plupart se sentaient un peu compliqué. Je suis curieux de voir comment un changement de code de base comme celui-ci peut se produire.
Défi
Écrivez un programme ou une fonction dans la langue de votre choix qui peut convertir une chaîne d'une base en chaîne d'une autre base. L'entrée doit être le nombre à convertir (chaîne), de la base (numéro base-10), à la base (numéro base-10) et le jeu de caractères (chaîne). La sortie doit être le nombre converti (chaîne).
Voici quelques détails et règles supplémentaires:
- Le nombre à convertir sera un entier non négatif (car
-
et.
peut être dans le jeu de caractères). Il en sera de même pour la sortie. - Les zéros non significatifs (le premier caractère du jeu de caractères) doivent être tronqués. Si le résultat est zéro, un seul chiffre zéro doit rester.
- La plage de base minimale prise en charge est comprise entre 2 et 95, composée des caractères ascii imprimables.
- L'entrée du nombre à convertir, le jeu de caractères et la sortie doivent tous être du type de données chaîne. Les bases doivent être du type de données entier de base 10 (ou des nombres entiers flottants).
- La longueur de la chaîne de numéro d'entrée peut être très grande. Il est difficile de quantifier un minimum raisonnable, mais attendez-vous à ce qu'il soit capable de gérer au moins 1000 caractères et de compléter 100 caractères en moins de 10 secondes sur une machine décente (très généreux pour ce genre de problème, mais je ne veux pas vitesse pour être au centre).
- Vous ne pouvez pas utiliser les fonctions intégrées de changement de base.
- L'entrée du jeu de caractères peut être dans n'importe quel arrangement, pas seulement le 0-9a-z typique, etc.
- Supposons que seule une entrée valide sera utilisée. Ne vous inquiétez pas de la gestion des erreurs.
Le gagnant sera déterminé par le code le plus court qui remplit les critères. Ils seront sélectionnés dans au moins 7 jours sur 10, ou si / quand il y a eu suffisamment de soumissions. En cas d'égalité, le code qui s'exécute le plus vite sera le vainqueur. Si elle est suffisamment proche en vitesse / performances, la réponse qui est venue plus tôt l'emporte.
Exemples
Voici quelques exemples d'entrée et de sortie que votre code devrait être capable de gérer:
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
? Plus précisément, pourrais-je utiliser un intégré pour convertir l'entrée en une base intermédiaire? Puis-je ensuite utiliser un intégré pour convertir en la base cible? Souhaitez-vous quelque chose 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
?