Entero para encadenar con la raíz dada

13

Escriba la función más corta para convertir un número entero en una representación numérica dada una raíz entre 2 y 62. por ejemplo:

to_string(351837066319, 31) => "codegolf"
Michiel de Mare
fuente
2
Del ejemplo deduzco que las letras minúsculas son lo primero, es decir, los dígitos en la base 62 son 0-9, az, AZ en ese orden.
sepp2k
Sí, exactamente, eso es.
Michiel de Mare
at 0:00Dang, perfecto.
Zacharý

Respuestas:

4

Ruby 1.8 - 75 caracteres, con recursión.

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

Sin recursividad

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}

(ambos basados ​​en la solución 1.9 de Dogbert).

Michiel de Mare
fuente
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édito debido a Hoa Long Tam por el truco de importación de cadenas

Juan
fuente
3

dc - 43 caracteres

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

Podemos acortar esto un poco si suponemos que la pila contiene solo los dos argumentos.

[[58-]s_dSb~dZ39*+dB3<_9+SadLbr0<fLaPc]sf

Como programa independiente, solo necesitamos 37 caracteres:

?o[58-]s_[O~dZ39*+dB3<_9+rd0<xrP]dsxx

En lugar de usar [39+]sz9<z, simplemente usamos Z39*+, lo que agregará 39 para un número de un solo dígito y 78 para un número de dos dígitos. En lugar de 113, usamos B3( ADtambién funciona).

Nabb
fuente
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'

EDITAR : "o '0'" agregado para el caso de cadena vacía

Hoa Long Tam
fuente
Falla cuando n = 0, devuelve una cadena vacía cuando debería devolver '0'. De todos modos +1 para el truco de la cuerda
Juan
2

dc, 61 caracteres

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

Correr como:

dc -e'[sr[lr~rd0<x]dsxxk[39+]sa[58-]sb[d9<ad78<b48+anz0<p]dspxIP]sf' -e'351837066319 31 lfx'

o:

dc -f base.dc -e '351837066319 31 lfx'

Explicación: Tomamos el número y la base en la pila. srguarda la base en el registro r. La función recursiva [lr~rd0<x]dsxxdescompone un número TOSen sus dígitos en la base register r. El primer dígito siempre es 0, eliminado de la pila por k(establece la precisión, que por defecto también es 0, por lo que es equivalente a un nop). Luego, la función recursiva [48+d57<ad122<banz0<p]dspxgenera cada dígito en ASCII, con la ayuda de las funciones a ( [39+]sa) y b ( [58-]sb). IPEmite una nueva línea. La función se almacena en el registro fy puede ser invocada por lfx.

ninjalj
fuente
1
Si te mueves 48+ hasta el final, salva dos (57 y 122 dejan caer un personaje). También un descuido menor es que, como función, no puede asumir que no hay nada más en la pila, pero el problema se eliminaría si fusionara los bucles (lo que también ahorraría algunos caracteres).
Nabb
2

Ruby - 72 70 59 caracteres

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

Sin recursión, 70 caracteres

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

Prueba

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

Haskell, 109 personajes

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
fuente
1

Befunge - 53 x 2 = 106 caracteres

O 53 + 46 = 99 caracteres si está dispuesto a enrutar otras partes de su programa por la parte inferior izquierda.

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

Primero coloque el número que se convertirá en la pila, luego la raíz e ingrese esta función desde la esquina superior izquierda hacia la derecha. Producirá la cadena por usted (ya que Befunge no admite variables de cadena) y se irá desde abajo $hacia abajo. Requiere la (1,1)celda para el almacenamiento de radix.

Por ejemplo, para el ejemplo dado poner 351837066319en la entrada y ejecutar:

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

Golfscript - 32 caracteres

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

Rubí 1.9 - 80 74 68

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

Con '0' para la cadena vacía, 95 89 82 caracteres:

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: desafortunadamente solo funciona hasta la base 36:

t=->n,b{n.to_s(b)}
Michael Kohl
fuente
2
Puede reemplazar el ]+['s con ,.
Nemo157
1

Bash, 79 caracteres

f(){
dc<<<$2o$1p|perl -pe"y/A-Z/a-z/;s/ \d+/chr$&+($&<10?48:$&<36?87:29)/ge"
}
ninjalj
fuente
BC_BASE_MAX está documentado como 16. No sé qué milagro hace que la salida sea correcta en la entrada de muestra, pero genera basura (es decir, caracteres no alfanuméricos) para la mayoría de las otras bases.
JB
@JB: ¿qué bc estás usando? GNU bc debería funcionar. sysconf(_SC_BC_BASE_MAX)devuelve 99 en mi sistema, 16 es el mínimo requerido.
ninjalj
@JB: también tenga en cuenta que las revisiones anteriores tenían errores, acababa de leer los requisitos de la pregunta.
ninjalj
aC 1.06. Ahora que lo mencionas, obtuve la figura de la página de manual, pero la leí mal. 16 es el límite base de entrada. El límite base de salida es 999. Primero probé una versión anterior, veamos eso de nuevo ahora.
JB
1
Creo que esta muestra letras mayúsculas para las bases 11-16 en lugar de minúsculas. Puede guardar algunos en la conversión base utilizando en dclugar de bc.
Nabb