Podemos encurtar um pouco isso se assumirmos que a pilha contém apenas os dois argumentos.
[[58-]s_dSb~dZ39*+dB3<_9+SadLbr0<fLaPc]sf
Como um programa independente, precisamos apenas de 37 caracteres:
?o[58-]s_[O~dZ39*+dB3<_9+rd0<xrP]dsxx
Em vez de usar [39+]sz9<z, simplesmente usamos Z39*+, que adicionará 39 para um número de um dígito e 78 para um número de dois dígitos. Em vez de 113, usamos B3( ADtambém funciona).
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'
Explicação: Pegamos o número e a base na pilha. srsalva a base no registro r. A função recursiva [lr~rd0<x]dsxxdecompõe um número TOSem seus dígitos na base register r. O primeiro dígito é sempre 0, removido da pilha por k(defina a precisão, que por padrão também é 0, portanto é equivalente a um nop). Então, a função recursiva [48+d57<ad122<banz0<p]dspxgera cada dígito em ASCII, com a ajuda das funções a ( [39+]sa) eb ( [58-]sb). IPgera uma nova linha. A função é armazenada no registro fe pode ser chamada por lfx.
Se você mover 48+ para o final, ele salvará dois (57 e 122 largam um personagem). Além disso, uma pequena supervisão é que, como função, você não pode assumir que não há mais nada na pilha, mas o problema seria removido se você mesclasse os loops (o que também salvaria alguns caracteres).
Ou 53 + 46 = 99 caracteres, se você desejar encaminhar outras partes do seu programa pelo canto inferior esquerdo.
11p01-\>:11g%\11g/:#v_$>:1+!#v_:45+`!#v_:75*`!#v_ v
^ < ^, $# +"0" < +"'" <-":"<
Primeiro, coloque o número a ser convertido na pilha, depois o radical e insira essa função a partir do canto superior esquerdo, indo para a direita. Irá gerar a string para você (já que o Befunge não suporta variáveis de string) e sair do fundo $para baixo. Requer a (1,1)célula para armazenamento de radix.
Por exemplo, para o exemplo dado, insira 351837066319a entrada e execute:
BC_BASE_MAX está documentado como sendo 16. Não sei qual milagre faz a saída correta na entrada de amostra, mas gera lixo (ou seja, caracteres não alfanuméricos) para a maioria das outras bases.
JB
@JB: qual bc você está usando? O GNU bc deve funcionar. sysconf(_SC_BC_BASE_MAX)retorna 99 no meu sistema, 16 é o mínimo necessário.
Ninjalj
@JB: observe também que as revisões anteriores eram de buggy, acabei de examinar os requisitos da pergunta.
Ninjalj
bc 1,06. Agora você mencionou, eu peguei a figura da página de manual, mas a interpretei mal. 16 é o limite da base de entrada. O limite da base de saída é 999. Tentei primeiro uma versão anterior, vamos ver isso novamente agora.
JB
1
Eu acho que este gera letras maiúsculas para as bases 11-16 em vez de minúsculas. Você pode salvar alguns na conversão base usando em dcvez de bc.
at 0:00
, perfeito.Respostas:
Ruby 1,8 - 75 caracteres, com recursão.
Sem recursão
(ambos baseados na solução 1.9 de Dogbert.)
fonte
Python - 86
Crédito devido a Hoa Long Tam pelo truque de importação de cadeias
fonte
dc - 43 caracteres
Podemos encurtar um pouco isso se assumirmos que a pilha contém apenas os dois argumentos.
Como um programa independente, precisamos apenas de 37 caracteres:
Em vez de usar
[39+]sz9<z
, simplesmente usamosZ39*+
, que adicionará 39 para um número de um dígito e 78 para um número de dois dígitos. Em vez de113
, usamosB3
(AD
também funciona).fonte
Python,
9399EDIT : "ou '0'" adicionado para maiúsculas e minúsculas
fonte
dc, 61 caracteres
Correr como:
ou:
Explicação: Pegamos o número e a base na pilha.
sr
salva a base no registro r. A função recursiva[lr~rd0<x]dsxx
decompõe um númeroTOS
em seus dígitos na baseregister r
. O primeiro dígito é sempre 0, removido da pilha pork
(defina a precisão, que por padrão também é 0, portanto é equivalente a um nop). Então, a função recursiva[48+d57<ad122<banz0<p]dspx
gera cada dígito em ASCII, com a ajuda das funções a ([39+]sa
) eb ([58-]sb
).IP
gera uma nova linha. A função é armazenada no registrof
e pode ser chamada porlfx
.fonte
Ruby -
727059 caracteresSem recursão, 70 caracteres
Teste
fonte
Haskell, 109 caracteres
fonte
Befunge - 53 x 2 = 106 caracteres
Ou 53 + 46 = 99 caracteres, se você desejar encaminhar outras partes do seu programa pelo canto inferior esquerdo.
Primeiro, coloque o número a ser convertido na pilha, depois o radical e insira essa função a partir do canto superior esquerdo, indo para a direita. Irá gerar a string para você (já que o Befunge não suporta variáveis de string) e sair do fundo
$
para baixo. Requer a(1,1)
célula para armazenamento de radix.Por exemplo, para o exemplo dado, insira
351837066319
a entrada e execute:fonte
Golfscript - 32 caracteres
fonte
Rubi 1.9 -
807468t = -> n, b {d = ? 0 ..? 9 ,? a ..? z, *? A ..? Z; s = ''; (s = d [n% b] + s; n / = b) enquanto n> 0; s}
Com '0' para cadeia vazia,
958982 caracteres:Ruby 1.9 - infelizmente só funciona até a base 36:
fonte
]+[
por,
.Bash, 79 caracteres
fonte
sysconf(_SC_BC_BASE_MAX)
retorna 99 no meu sistema, 16 é o mínimo necessário.dc
vez debc
.