Inteiro para string com dado raio

13

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"
Michiel de Mare
fonte
2
A partir do exemplo, entendo que as letras minúsculas são as primeiras, ou seja, os dígitos na base 62 são 0-9, az, AZ nessa ordem?
sepp2k
Sim, exatamente, é isso.
Michiel de Mare
at 0:00, perfeito.
Zachary

Respostas:

4

Ruby 1,8 - 75 caracteres, com recursão.

f=proc{|n,b|(n<b ? "":f[n/b,b])+([*'0'..'9']+[*'a'..'z']+[*'A'..'Z'])[n%b]}

Sem recursão

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

Michiel de Mare
fonte
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 devido a Hoa Long Tam pelo truque de importação de cadeias

Juan
fonte
3

dc - 43 caracteres

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

Nabb
fonte
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'

EDIT : "ou '0'" adicionado para maiúsculas e minúsculas

Hoa Long Tam
fonte
Falha quando n = 0, retorna uma string vazia quando deve retornar '0'. De qualquer forma +1 para o truque de cordas
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'

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.

ninjalj
fonte
1
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).
Nabb 07/02/11
2

Ruby - 72 70 59 caracteres

f=->n,b{(n<b ? "":f[n/b,b])+[*?0..?9,*?a..?z,*?A..?Z][n%b]}

Sem recursão, 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}

Teste

irb(main):080:0> f[351837066319, 31]
=> "codegolf"
irb(main):081:0> f[0, 31]
=> "0"
Dogbert
fonte
1

Haskell, 109 caracteres

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
sepp2k
fonte
1

Befunge - 53 x 2 = 106 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:

&56*1+    11p01-\>:11g%\11g/:#v_$>:1+!#v_:45+`!#v_:75*`!#v_   v
                 ^            <  ^,    $# +"0"  < +"'"   <-":"<
                                       @
Nemo157
fonte
1

Golfscript - 32 caracteres

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

Rubi 1.9 - 80 74 68

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)}
Michael Kohl
fonte
2
Você pode substituir os ]+[por ,.
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"
}
ninjalj
fonte
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.
Nabb