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).
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.
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).
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:
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.
at 0:00
Dang, perfecto.Respuestas:
Ruby 1.8 - 75 caracteres, con recursión.
Sin recursividad
(ambos basados en la solución 1.9 de Dogbert).
fuente
Python - 86
Crédito debido a Hoa Long Tam por el truco de importación de cadenas
fuente
dc - 43 caracteres
Podemos acortar esto un poco si suponemos que la pila contiene solo los dos argumentos.
Como programa independiente, solo necesitamos 37 caracteres:
En lugar de usar
[39+]sz9<z
, simplemente usamosZ39*+
, 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 de113
, usamosB3
(AD
también funciona).fuente
Python,
9399EDITAR : "o '0'" agregado para el caso de cadena vacía
fuente
dc, 61 caracteres
Correr como:
o:
Explicación: Tomamos el número y la base en la pila.
sr
guarda la base en el registro r. La función recursiva[lr~rd0<x]dsxx
descompone un númeroTOS
en sus dígitos en la baseregister r
. El primer dígito siempre es 0, eliminado de la pila pork
(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]dspx
genera cada dígito en ASCII, con la ayuda de las funciones a ([39+]sa
) y b ([58-]sb
).IP
Emite una nueva línea. La función se almacena en el registrof
y puede ser invocada porlfx
.fuente
Ruby -
727059 caracteresSin recursión, 70 caracteres
Prueba
fuente
Haskell, 109 personajes
fuente
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.
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
351837066319
en la entrada y ejecutar:fuente
Golfscript - 32 caracteres
fuente
Rubí 1.9 -
807468t = -> 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,
958982 caracteres:Ruby 1.9: desafortunadamente solo funciona hasta la base 36:
fuente
]+[
's con,
.Bash, 79 caracteres
fuente
sysconf(_SC_BC_BASE_MAX)
devuelve 99 en mi sistema, 16 es el mínimo requerido.dc
lugar debc
.