Escreva a função mais curta para converter um número inteiro em uma representação numérica, dada uma raiz entre 2 e 62. por exemplo:
to_string(351837066319, 31) => "codegolf"
at 0:00, perfeito.
Escreva a função mais curta para converter um número inteiro em uma representação numérica, dada uma raiz entre 2 e 62. por exemplo:
to_string(351837066319, 31) => "codegolf"
at 0:00, perfeito.
Respostas:
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 baseados na solução 1.9 de Dogbert.)
[sb[58-]s_[lb~dZ39*+dB3<_9+rd0<xrP]dsxxk]sf
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).
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'
EDIT : "ou '0'" adicionado para maiúsculas e minúsculas
[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'
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.
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:
&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) enquanto n> 0; s}
Com '0' para cadeia vazia, 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 - infelizmente só funciona até a base 36:
t=->n,b{n.to_s(b)}
]+[por ,.
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)retorna 99 no meu sistema, 16 é o mínimo necessário.
dcvez de bc.