fundo
A maioria das pessoas aqui deve estar familiarizada com vários sistemas básicos: decimal, binário, hexadecimal, octal. Por exemplo, no sistema hexadecimal, o número 12345 16 representaria
1*16^4 + 2*16^3 + 3*16^2 + 4*16^1 + 5*16^0
Observe que geralmente não esperamos que a base (aqui 16
) mude de dígito para dígito.
Uma generalização desses sistemas posicionais usuais permite usar uma base numérica diferente para cada dígito. Por exemplo, se estivéssemos alternando entre sistema decimal e binário (começando com a base 10 no dígito menos significativo), o número 190315 [2,10] representaria
1*10*2*10*2*10 + 9*2*10*2*10 + 0*10*2*10 + 3*2*10 + 1*10 + 5 = 7675
Denotamos essa base como [2,10]
. A base mais à direita corresponde ao dígito menos significativo. Então você percorre as bases (à esquerda) enquanto percorre os dígitos (à esquerda), contornando se há mais dígitos do que bases.
Para ler mais, consulte a Wikipedia .
O desafio
Escreva um programa ou função que, dada uma lista de dígitos, D
uma base de entrada I
e uma base de saída O
, converta o número inteiro representado por D
de base I
em base O
. Você pode receber entradas via STDIN, ARGV ou argumento de função e retornar o resultado ou imprimi-lo em STDOUT.
Você pode assumir:
- que os números em
I
eO
são todos maiores que1
. - o
I
eO
não estão vazios. - que o número de entrada é válido na base fornecida (ou seja, nenhum dígito maior que sua base).
D
pode estar vazio (representando 0
) ou pode ter zeros à esquerda. Sua saída não deve conter zeros à esquerda. Em particular, um resultado representando 0
deve ser retornado como uma lista vazia.
Você não deve usar nenhuma função de conversão básica interna ou de terceiros.
Isso é código de golfe, a resposta mais curta (em bytes) vence.
Exemplos
D I O Result
[1,0,0] [10] [2] [1,1,0,0,1,0,0]
[1,0,0] [2] [10] [4]
[1,9,0,3,1,5] [2,10] [10] [7,6,7,5]
[1,9,0,3,1,5] [2,10] [4,3,2] [2,0,1,1,0,1,3,0,1]
[52,0,0,0,0] [100,7,24,60,60] [10] [3,1,4,4,9,6,0,0]
[0,2,10] [2,4,8,16] [42] [1,0]
[] [123,456] [13] []
[0,0] [123,456] [13] []
fonte
[]
se a entrada é[0]
Respostas:
CJam, 45
Finalmente eu encontrei um bom uso de
j
.Como funciona
Long ArrayList Block j
executa o bloco que recebe um número inteiro como parâmetro eLong j
chama esse bloco recursivamente no bloco. Ele também armazenará os valores retornados pelo bloco em uma matriz interna, que é inicializada pelo parâmetro da matriz. Ele não executará o bloco se a entrada já estiver na matriz e o valor na matriz for retornado.Portanto, se eu inicializá-lo com uma matriz de uma matriz vazia, a matriz vazia será retornada para a entrada 0 e o bloco será executado para qualquer outra entrada.
CJam,
4948Entrada deve ser
O I D
.Exemplos:
Como funciona
fonte
_{}?
truque é realmente legal.{}e|
é o mesmo.j
? :)CJam,
62615957 bytesLê as matrizes de entrada a partir
[O I D]
de STDIN. Experimente online.Como funciona
Casos de teste
Observe que cadeias vazias e matrizes vazias são indistinguíveis do CJam, portanto,
[]p
imprime""
.fonte
Python 2 - 318
Eu estraguei a ordem dos argumentos por acidente, então tive que revertê-los. Vou trabalhar com o slice-fu para que as listas funcionem na outra direção mais tarde, já perdi todo o meu intervalo para o almoço: pFixo
fonte
APL, 78
Exemplos:
fonte
{{⍵↓⍨1⍳⍨×⍵}(99⍴⎕)⊤⍵⊥⍨⎕⍴⍨⍴⍵}
leva D como argumento direita, em seguida, pede I e O.Python 2-122
Muito simples, não conseguiu encontrar nenhum truque especial de golfe neste.
Ungolfed:
Edit: versão de programa de 116 bytes graças a FryAmTheEggman
Esta versão aceita entrada separada por vírgula, por exemplo
[1,9,0,3,1,5], [2,10], [10]
fonte
k2 -
8374 charFunção tendo um argumento. Isso foi muito mais adequado para K que J, e é por isso que não estou usando J. Seria apenas um monte de lixo de boxe / unboxing, e ninguém quer isso. Isso está no dialeto k2 (pode exigir alguma adaptação para funcionar no Kona de implementação de código aberto), mas vou mudar para k4 se puder diminuí-lo mais lá.
Observarei que defendo a escolha aqui e digo que uma lista de itens deve ser inserida como tal.
,2
é uma lista de um item, sendo o item escalar2
. Freqüentemente escalares e listas de um item são intercambiáveis, mas existe uma lógica nesse golfe que se baseia na suposição de argumentos de lista.Para explicar o golfe, vou dividi-lo em duas partes.
F
é o golfe,L
é o loop principal que calcula a saída. O mecanismo exato do loop éL
aplicado repetidamente a seus argumentos até o segundo argumento ser zero e, em seguida, esse resultado é retornado. (Esta é a.[L]/
parte.)Por explosão:
Em ação:
fonte
Perl 6 , 67 bytes
Tente
Expandido:
Caso você não tenha certeza de qual redução de triângulo faz:
Se eu pudesse pegar as entradas invertidas e gerar a saída inversa, seriam 47 bytes.
Tente
fonte