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"
at 0:00Dang, perfecto.
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"
at 0:00Dang, perfecto.
Respuestas:
f=proc{|n,b|(n<b ? "":f[n/b,b])+([*'0'..'9']+[*'a'..'z']+[*'A'..'Z'])[n%b]}
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).
[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).
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
[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.
f=->n,b{(n<b ? "":f[n/b,b])+[*?0..?9,*?a..?z,*?A..?Z][n%b]}
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"
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" < +"'" <-":"<
@
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)}
]+['s con ,.
f(){
dc<<<$2o$1p|perl -pe"y/A-Z/a-z/;s/ \d+/chr$&+($&<10?48:$&<36?87:29)/ge"
}
sysconf(_SC_BC_BASE_MAX)devuelve 99 en mi sistema, 16 es el mínimo requerido.
dclugar de bc.