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"

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


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


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


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


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.


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"

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

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"  < +"'"   <-":"<
                                       @

1

Golfscript - 32 caracteres

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

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

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"
}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.