Os poderes desejados poderão converter rapidamente qualquer número que eles possuírem em sua própria base de números, usando o formato que desejar.
Entrada
Seu programa deve aceitar 3 parâmetros.
- Number: o número da string a ser convertida
- InputFormat: a string base em que o número está atualmente
- OutputFormat: a cadeia de base na qual o número deve ser convertido.
Saída
Seu programa deve converter a Number
base de números antiga InputFormat
para a nova base de númerosOutputFormat
Exemplos
("1","0123456789","9876543210") = "8"
("985724","9876543210","0123456789ABCDEF") = "37C3"
("FF","0123456789ABCDEF","0123456789") = "255"
("FF","0123456789ABCDEF","01234567") = "377"
("18457184548971248772157", "0123456789","Aa0Bb1Cc2Dd3Ee4Ff5Gg6Hh7Ii8Jj9Kk,Ll.Mm[Nn]Oo@Pp#Qq}Rr{Ss-Tt+Uu=Vv_Ww!Xx%Yy*Zz") = ",sekYFg_fdXb"
Adicional
O novo teste da base 77 não é necessário, se ele funcionar
- se você estiver em um idioma no qual você precisa primeiro converter para um número e estiver bloqueado no 32Bit, poderá ignorá-lo.
- como é um teste adicional.
Todos os exemplos foram gerados pelo PHP 7.2 com a extensão bcmath usando o código a seguir (vars mins mas código formatado). provavelmente haverá uma maneira mais curta. Foi exatamente dessa maneira que eu criei para o sistema com o qual eu precisava fazer isso. Seria bom ver se alguém poderia ter uma versão mais curta.
PHP 7.2 (bcmath - extensão) 614 bytes
<?php
function f($a, $b, $c)
{
$d= str_split($b,1);
$e= str_split($c,1);
$f= str_split($a,1);
$g=strlen($b);
$h=strlen($c);
$k=strlen($a);
$r='';
if ($c== '0123456789')
{
$r=0;
for ($i = 1;$i <= $k; $i++)
$retval = bcadd($retval, bcmul(array_search($f[$i-1], $d),bcpow($g,$k-$i)));
return $r;
}
if ($b!= '0123456789')
$l=f($a, $b, '0123456789');
else
$l= $a;
if ($l<strlen($c))
return $e[$l];
while($l!= '0')
{
$r= $e[bcmod($l,$h)].$r;
$l= bcdiv($l,$h,0);
}
return $r;
}
Pontuação
Isso é código de golfe; o código mais curto vence. Aplicam-se brechas padrão.
fonte
["zX", "tXdsyqzSDRP02", "brFNC02bc"] => "cb"
. (ou seja lá o que realmente deve ser, se isso é incorreto)Respostas:
MATL , 2 bytes
Experimente online!
Todos os casos de teste.
Para o senhor Za !
fonte
Za
conversão base, mas os documentos em matl.suever não estavam claros de que aceitavam os caracteres da base, então eu não tentei. RIP me!R , 124 bytes
Experimente online!
Ugh, isso foi doozy. Eu uso os truques típicos de conversão de base para R, mas as manipulações de string em R ainda são confusas!
fonte
log(N+1,T)
, mas causando um zero à esquerda, por vezes, por exemplo, quando você converter 31 da base 10 a base 2 :(log(N+!N,T)
claro que você poderia usar!
com o significado originalAPL (Dyalog Unicode) , 22 bytes
Infix anônimo lambda. Toma
InputFormat
como argumento à esquerda eOutputFormat
como argumento à direita e solicita aNumber
partir de stdin. Assume⎕IO
( I ndex O rigin) como sendo0
, o padrão em muitos sistemas.Experimente online!
{
...}
"dfn";⍺
é argumento à esquerda,⍵
é argumento à direita(mnemônico: extremidades esquerda e direita do alfabeto grego)
⍵[
...]
Indexe o formato de saída com o seguinte:⎕
solicitação de entrada⍺⍳
ɩ índices desses caracteres no formato de entrada(
...)⊥
Avalie como estando na seguinte base:≢⍺
o comprimento do formato de entrada⊢
rendimento que (separa¯1
de(≢⍺)
)(
…)⊥⍣¯1
Converta para a seguinte base:≢⍺
o comprimento do formato de saídafonte
Japt, 5 bytes
Regressando ao golfe após um intervalo de 2 semanas
Tente
Explicação
fonte
C (gcc), 79 + 46 = 125 bytes
Isso deve ser compilado com o
bandeira. (Sim, isso é incrivelmente superficial, e é por isso que estou mantendo minha resposta antiga abaixo.) Isso define uma macro
f
que gera a resposta para STDOUT.Experimente online!
C (gcc),
133131 bytesExperimente online!
Isso define uma função
f
que envia a resposta para STDOUT.fonte
putchar
vez dewrite
e alterando um pouco o loop de decodificação: Experimente online!index
função salva-me um byte, bem como com a minha abordagem, não sabia sobre isso;)05AB1E , 5 bytes
Experimente online!
Isso não funciona na versão herdada do 05AB1E. Funciona apenas na nova versão, reescrita do Elixir.
Como funciona
fonte
MATL , 5 bytes
sundar encontrou o real embutido para fazer isso! Voto acima dessa resposta em vez da minha idiota :-(
Experimente online!
fonte
Carvão , 5 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
A
BaseString
função converte automaticamente entre número e string, dependendo do tipo do primeiro parâmetro.fonte
Python 2 ,
132129122121 bytesExperimente online!
Uma função anônima (obrigado, Erik o Outgolfer !), Que converte o número original em um número inteiro de base 10, depois passa o número inteiro e a nova string de base para a função g (), que converte recursivamente para a nova base. Agora passa o comprimento do OutputFormat como um parâmetro para g ().
Atualizado g () para um número de bytes mais baixo. (obrigado, Dennis !)
Índice substituído () por find (). (obrigado, Sr. Xcoder !)
Explicação Ungolfed:
fonte
f=
, funções anônimas são permitidas por padrão.g=lambda n,c:c[n:n+1]or g(n/len(c),c)+c[n%len(c)]
.lambda n,a,b:g(sum(len(a)**i*a.find(j)for i,j in enumerate(n[::-1])),b,len(b))
.Gelatina , 11 bytes
Experimente online!
Ordem dos argumentos: InputFormat, Number, OutputFormat. Certifique-se de citar os argumentos com escape apropriado!
fonte
Pitão, 21 bytes
Suíte de teste
Explicação:fonte
Haskell , 119 bytes
Experimente online!
fonte
Perl 6 ,
10097 bytesExperimente online!
Bloco de código anônimo que utiliza três cadeias de caracteres em ordem, entrada, formato de entrada e formato de saída e retorna uma string
Explicação:
fonte
VBA, 182 bytes
Uma sub-rotina declarada que recebe entrada,,
n
no idiomay
e os projeta no idiomaz
.fonte
JavaScript (ES6),
9086 bytesToma entrada como
(input_format)(output_format)(number)
.Experimente online!
fonte
C (gcc) ,
130129 bytesExperimente online!
-1 byte usando em
index
vez destrchr
.Essa é uma abordagem iterativa simples, reutilizando algumas variáveis (e, dessa forma, abusando
sizeof(int) == sizeof(char *)
do TIO) para salvar bytes.Entrada:
i
número de entradas
caracteres base de origemt
caracteres base de destinoSaída:
r
número do resultado (ponteiro para um buffer)Explicação:
fonte
bcopy(r,r+1,++i)
vez dememmove(r+1,r,++i)
Python 2 ,
9795 bytesAgradecimentos a Chas Brown por -2 bytes.
Experimente online!
fonte
Java 10, 131 bytes
Um lambda pegando os parâmetros em ordem como strings e retornando uma string.
Experimente Online
Ungolfed
fonte