Entier à chaîne avec radix donné

13

Écrivez la fonction la plus courte pour convertir un entier en une représentation numérique avec un radix compris entre 2 et 62. Par exemple:

to_string(351837066319, 31) => "codegolf"
Michiel de Mare
la source
2
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?
sepp2k
Oui, c'est tout.
Michiel de Mare
at 0:00, dang, parfait.
Zacharý

Réponses:

4

Ruby 1,8 - 75 caractères, avec récursivité.

f=proc{|n,b|(n<b ? "":f[n/b,b])+([*'0'..'9']+[*'a'..'z']+[*'A'..'Z'])[n%b]}

Sans récursivité

f=proc{|n,b|d=[*'0'..'9']+[*'a'..'z']+[*'A'..'Z'];s=d[n%b];s=d[n%b]+s while(n/=b)>0;s}

(tous deux basés sur la solution 1.9 de Dogbert.)

Michiel de Mare
la source
4

Python - 86

from string import*
def t(n,r,s=''):
 while n:s=printable[n%r]+s;n/=r
 return s or'0'

Crédit dû à Hoa Long Tam pour l'astuce d'importation de cordes

Juan
la source
3

dc - 43 caractères

[sb[58-]s_[lb~dZ39*+dB3<_9+rd0<xrP]dsxxk]sf

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).

Nabb
la source
3

Python, 93 99

from string import *
d=digits+letters
def t(n,b):
 s=''
 while n>0:s=d[n%b]+s;n/=b
 return s or '0'

EDIT : "ou '0'" ajouté pour le cas de chaîne vide

Hoa Long Tam
la source
Échoue lorsque n = 0, renvoie une chaîne vide quand il doit retourner «0». Quoi qu'il en soit +1 pour le tour de cordes
Juan
2

dc, 61 caractères

[sr[lr~rd0<x]dsxxk[39+]sa[58-]sb[d9<ad78<b48+anz0<p]dspxIP]sf

Courir comme:

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.

ninjalj
la source
1
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).
Nabb
2

Rubis - 72 70 59 caractères

f=->n,b{(n<b ? "":f[n/b,b])+[*?0..?9,*?a..?z,*?A..?Z][n%b]}

Sans récursivité, 70 caractères

f=->n,b{d=*?0..?9,*?a..?z,*?A..?Z;s=d[n%b];s=d[n%b]+s while(n/=b)>0;s}

Tester

irb(main):080:0> f[351837066319, 31]
=> "codegolf"
irb(main):081:0> f[0, 31]
=> "0"
Wile E. Coyote
la source
1

Haskell, 109 caractères

m=divMod
d(0,x)b=[f x]
d(r,x)b=f x:d(m r b)b
f=(!!)$['0'..'9']++['a'..'z']++['A'..'Z']
s x b=reverse$d(m x b)b
sepp2k
la source
1

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.

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:

&56*1+    11p01-\>:11g%\11g/:#v_$>:1+!#v_:45+`!#v_:75*`!#v_   v
                 ^            <  ^,    $# +"0"  < +"'"   <-":"<
                                       @
Nemo157
la source
1

Golfscript - 32 caractères

{base{.9>39*+.74>58*48--}%''+}:f
Nabb
la source
1

Rubis 1,9 - 80 74 68

t = -> 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, 95 89 82 caractères:

t=->n,b,s=''{d=*?0..?9,*?a..?z,*?A..?Z;(s=d[n%b]+s;n/=b)while n>0;s.empty?? ?0: s}

Ruby 1.9 - ne fonctionne malheureusement que jusqu'à la base 36:

t=->n,b{n.to_s(b)}
Michael Kohl
la source
2
Vous pouvez remplacer le ]+[s par ,.
Nemo157
1

Bash, 79 caractères

f(){
dc<<<$2o$1p|perl -pe"y/A-Z/a-z/;s/ \d+/chr$&+($&<10?48:$&<36?87:29)/ge"
}
ninjalj
la source
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.
Nabb