D'après l'exemple, je suppose que les lettres minuscules viennent en premier, c'est-à-dire que les chiffres de la base 62 sont 0-9, az, AZ dans cet ordre?
Nous pouvons raccourcir cela un peu si nous supposons que la pile ne contient que les deux arguments.
[[58-]s_dSb~dZ39*+dB3<_9+SadLbr0<fLaPc]sf
En tant que programme autonome, nous n'avons besoin que de 37 caractères:
?o[58-]s_[O~dZ39*+dB3<_9+rd0<xrP]dsxx
Au lieu d'utiliser [39+]sz9<z, nous utilisons simplement Z39*+, qui ajoutera 39 pour un numéro à un chiffre et 78 pour un numéro à deux chiffres. Au lieu de 113, nous utilisons B3( ADfonctionne également).
dc -e'[sr[lr~rd0<x]dsxxk[39+]sa[58-]sb[d9<ad78<b48+anz0<p]dspxIP]sf' -e'351837066319 31 lfx'
ou:
dc -f base.dc -e '351837066319 31 lfx'
Explication: Nous prenons le nombre et la base sur la pile. srenregistre la base dans le registre r. La fonction récursive [lr~rd0<x]dsxxdécompose un nombre TOSen ses chiffres en base register r. Le premier chiffre est toujours 0, supprimé de la pile par k(définir la précision, qui par défaut est également 0, il est donc équivalent à un nop). Ensuite, la fonction récursive [48+d57<ad122<banz0<p]dspxgénère chaque chiffre en ASCII, à l'aide des fonctions a ( [39+]sa) et b ( [58-]sb). IPaffiche une nouvelle ligne. La fonction est stockée dans le registre fet peut être invoquée par lfx.
Si vous vous déplacez de 48+ à la fin, il enregistre deux (57 et 122 déposent tous les deux un personnage). En outre, un oubli mineur est qu'en tant que fonction, vous ne pouvez pas supposer qu'il n'y a rien d'autre sur la pile, mais le problème serait supprimé si vous fusionniez les boucles (ce qui économiserait également quelques caractères).
Ou 53 + 46 = 99 caractères si vous souhaitez acheminer d'autres parties de votre programme en bas à gauche.
11p01-\>:11g%\11g/:#v_$>:1+!#v_:45+`!#v_:75*`!#v_ v
^ < ^, $# +"0" < +"'" <-":"<
Placez d'abord le nombre à convertir sur la pile, puis le radix et entrez cette fonction en haut à gauche en allant vers la droite. Sortira la chaîne pour vous (puisque Befunge ne prend pas en charge les variables de chaîne) et partira du bas $vers le bas. Nécessite la (1,1)cellule pour le stockage Radix.
Par exemple, pour l'exemple donné, mettez 351837066319dans l'entrée et exécutez:
BC_BASE_MAX est documenté comme étant 16. Je ne sais pas quel miracle rend la sortie directement sur l'entrée d'échantillon, mais elle produit des ordures (c'est-à-dire des caractères non alphanum) pour la plupart des autres bases.
JB
@JB: quel bc utilisez-vous? GNU bc devrait fonctionner. sysconf(_SC_BC_BASE_MAX)renvoie 99 sur mon système, 16 est le minimum requis.
ninjalj
@JB: notez également que les révisions précédentes où buggy, je venais de survoler les exigences de la question.
ninjalj
bc 1.06. Maintenant, vous le mentionnez, j'ai obtenu le chiffre de la page de manuel, mais je l'ai mal lu. 16 est la limite de base d'entrée. La limite de base de sortie est de 999. J'ai d'abord essayé une version antérieure, voyons cela de nouveau maintenant.
JB
1
Je pense que celui-ci génère des lettres majuscules pour les bases 11-16 au lieu de minuscules. Vous pouvez en enregistrer quelques-uns lors de la conversion de base en utilisant dcau lieu de bc.
at 0:00
, dang, parfait.Réponses:
Ruby 1,8 - 75 caractères, avec récursivité.
Sans récursivité
(tous deux basés sur la solution 1.9 de Dogbert.)
la source
Python - 86
Crédit dû à Hoa Long Tam pour l'astuce d'importation de cordes
la source
dc - 43 caractères
Nous pouvons raccourcir cela un peu si nous supposons que la pile ne contient que les deux arguments.
En tant que programme autonome, nous n'avons besoin que de 37 caractères:
Au lieu d'utiliser
[39+]sz9<z
, nous utilisons simplementZ39*+
, qui ajoutera 39 pour un numéro à un chiffre et 78 pour un numéro à deux chiffres. Au lieu de113
, nous utilisonsB3
(AD
fonctionne également).la source
Python,
9399EDIT : "ou '0'" ajouté pour le cas de chaîne vide
la source
dc, 61 caractères
Courir comme:
ou:
Explication: Nous prenons le nombre et la base sur la pile.
sr
enregistre la base dans le registre r. La fonction récursive[lr~rd0<x]dsxx
décompose un nombreTOS
en ses chiffres en baseregister r
. Le premier chiffre est toujours 0, supprimé de la pile park
(définir la précision, qui par défaut est également 0, il est donc équivalent à un nop). Ensuite, la fonction récursive[48+d57<ad122<banz0<p]dspx
génère chaque chiffre en ASCII, à l'aide des fonctions a ([39+]sa
) et b ([58-]sb
).IP
affiche une nouvelle ligne. La fonction est stockée dans le registref
et peut être invoquée parlfx
.la source
Rubis -
727059 caractèresSans récursivité, 70 caractères
Tester
la source
Haskell, 109 caractères
la source
Befunge - 53 x 2 = 106 caractères
Ou 53 + 46 = 99 caractères si vous souhaitez acheminer d'autres parties de votre programme en bas à gauche.
Placez d'abord le nombre à convertir sur la pile, puis le radix et entrez cette fonction en haut à gauche en allant vers la droite. Sortira la chaîne pour vous (puisque Befunge ne prend pas en charge les variables de chaîne) et partira du bas
$
vers le bas. Nécessite la(1,1)
cellule pour le stockage Radix.Par exemple, pour l'exemple donné, mettez
351837066319
dans l'entrée et exécutez:la source
Golfscript - 32 caractères
la source
Rubis 1,9 -
807468t = -> n, b {d = ? 0 ..? 9 ,? a ..? z, *? A ..? Z; s = ''; (s = d [n% b] + s; n / = b) tandis que n> 0; s}
Avec '0' pour une chaîne vide,
958982 caractères:Ruby 1.9 - ne fonctionne malheureusement que jusqu'à la base 36:
la source
]+[
s par,
.Bash, 79 caractères
la source
sysconf(_SC_BC_BASE_MAX)
renvoie 99 sur mon système, 16 est le minimum requis.dc
au lieu debc
.