Dado um número inteiro positivo k > 1
e um número inteiro não negativo i
, gere um número k
-tuplo (ou k
vetor dimensional) de números inteiros não negativos. Para cada k
, o mapa de ℕ para ℕ k , deve ser bijective . Ou seja, toda entrada i
deve produzir uma tupla diferente, e toda tupla possível deve ser produzida por alguma entrada i
.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
Você pode usar qualquer formato de lista simples, conveniente e inequívoco para a saída.
Sua solução não deve impor limites artificiais k
e, i
mas você pode assumir que eles se encaixam no tamanho inteiro nativo do seu idioma. No mínimo, você deve suportar valores de até 255
, mesmo que o tamanho inteiro nativo seja menor que isso.
De qualquer forma 1 < k < 32
, seu código deve produzir um resultado em questão de segundos (é claro, se sua resposta não suportar esse tamanho devido à regra anterior, o limite será ajustado de acordo). Este deve ser nenhum problema: é possível resolver este desafio de tal forma que ele funciona até 2 128 em poucos segundos, mas o limite é de lá para respostas a evitar que, na verdade, iterate a partir de para encontrar o resultado.i < 231
i
0
i
Inclua na sua resposta uma descrição do mapeamento escolhido e uma justificativa para o motivo de ele ser bijetivo (isso não precisa ser uma prova formal).
Este é o código golf, a resposta mais curta (em bytes) vence.
Desafios relacionados
fonte
q~2bW%1$Te]/zWf%2fbp
(ordem inversa de entrada)CJam, 18 bytes
Ele usa uma fórmula mais estúpida.
Experimente aqui .
Explicação
Em resumo, ele mapeia um número inteiro positivo para:
fonte
Python 2, 62
Esse código é feio e jogável, mas a idéia é muito simples.
Embalar
k
expansões binárias em um por ler todos osk
dígitos th com diferentes deslocamentos. Por exemplo, comk=3
, a entrada é357
mapeada para(3,0,7)
:Fechar os números novamente reverte-o, então é uma bijeção. Ao fazer isso, pense nas expansões binárias como tendo um número infinito de zeros à esquerda.
fonte
J,
382827 bytesEste é um verbo tácito, dyadic que leva i e k como argumentos esquerda e direita. Experimente online com J.js .
Idéia
Nós definimos um mapa f: N → N k por f (i): = (α 1 , ... α k-1 , p 1 α k ... p 2 α k + 1 ... - 1) , onde ⟨p n ⟩ é a sequência de números primos e i + 1 = p 1 α 1 p 2 α 2 … .
Pelo teorema aritmético fundamental, o mapa g: N → N ω definido por g (i): = (α 1 , α 2 ,…) (expoentes da fatoração primária de i + 1 ) é bijetivo.
Como f (i) = (g 1 (i),… g k-1 (i), g -1 (g k (i), g k + 1 (i),…)) , o mapa f é bijetivo como bem.
Código
fonte
Python 2, 72
A função
q
atua em números binários, pegando cada segundo bit a partir do final. Como resultado,q(z), q(z>>1)
fornece dois números cujos dígitos binários se intercalam para fornecerz
. Por exemplo, 594 se divide em 12 e 17.Esta é uma bijeção porque podemos compactar os números novamente para recuperar o número original.
A função
g
aplica essesk-1
tempos de bijeção , expandindo de um único elemento para um par para um triplo ... para umk
triplo. Cada vez, o último elemento é expandido para dois elementos. Isso é feito recursivamente, mapeando a entrada para um par via bijeção, pegando o primeiro elemento do par para a primeira entrada da saída e aplicando a função recursivamentek-1
ao segundo elemento para produzir as entradas restantes.fonte