Dado un número entero positivo k > 1y un número entero no negativo i, genera una ktupla (o kvector dimensional) de números enteros no negativos. Para cada k, el mapa de ℕ a ℕ k , debe ser biyectivo . Es decir, cada entrada idebe producir una tupla diferente y cada tupla posible debe ser producida por alguna entrada i.
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), el valor de retorno de la función o el parámetro de función (out).
Puede utilizar cualquier formato de lista plana conveniente, inequívoco para la salida.
Su solución no debería imponer límites artificiales en ky ipero puede suponer que encajan en tamaño entero nativo de su lengua. Por lo menos, debe admitir valores hasta 255, sin embargo, incluso su tamaño entero nativo es más pequeño que eso.
En cualquier caso 1 < k < 32, su código debería producir un resultado en cuestión de segundos (por supuesto, si su respuesta no es tan grande debido a la regla anterior, el límite se ajusta en consecuencia). Esto debería ser ningún problema: es posible resolver este desafío tal que funciona hasta 2 128 en unos pocos segundos, pero el límite está ahí para respuestas Evita que en realidad iterate de que para encontrar el resultado.i < 231i0i
Incluya en su respuesta una descripción de su mapeo elegido y una justificación de por qué es biyectivo (esto no necesita ser una prueba formal).
Este es el código de golf, gana la respuesta más corta (en bytes).
Desafíos relacionados
fuente

q~2bW%1$Te]/zWf%2fbp(orden de entrada opuesto)CJam, 18 bytes
Utiliza una fórmula más estúpida.
Pruébalo aquí .
Explicación
En resumen, mapea un entero positivo para:
fuente
Pitón 2, 62
Este código es feo y golfable, pero la idea es muy simple.
Empaque
kexpansiones binarias en una leyendo cadakdígito con diferentes desplazamientos. Por ejemplo, conk=3, la entrada se357asigna a(3,0,7):Comprimir los números de nuevo juntos lo invierte, por lo que es una biyección. Al hacerlo, piense que las expansiones binarias tienen un número infinito de ceros a la izquierda.
fuente
J,
382827 bytesEste es un verbo tácito y diádico que toma i y k como argumentos izquierdo y derecho. Pruébelo en línea con J.js .
Idea
Definimos un mapa f: N → N k por f (i): = (α 1 , ... α k-1 , p 1 α k ... p 2 α k + 1 ... - 1) , donde ⟨p n ⟩ es la secuencia de números primos e i + 1 = p 1 α 1 p 2 α 2 … .
Según el teorema aritmético fundamental, el mapa g: N → N ω definido por g (i): = (α 1 , α 2 , ...) (exponentes de la factorización prima de i + 1 ) es biyectivo.
Como f (i) = (g 1 (i),… g k-1 (i), g -1 (g k (i), g k + 1 (i), ...)) , el mapa f es biyectivo como bien.
Código
fuente
Pitón 2, 72
La función
qactúa sobre números binarios tomando cada segundo bit comenzando desde el final. Como resultado,q(z), q(z>>1)da dos números cuyos dígitos binarios se entremezclan para darz. Por ejemplo, 594 se divide en 12 y 17.Esto es una biyección porque podemos volver a unir los números para recuperar el número original.
La función
gaplica estosk-1tiempos de biyección , expandiéndose de un solo elemento a un par a un triple ... a unaktupla. Cada vez, el último elemento se expande a dos elementos. Esto se hace recursivamente mapeando la entrada a un par a través de la biyección, tomando el primer elemento del par para la primera entrada de la salida y aplicando la función recursivamente conk-1el segundo elemento para producir las entradas restantes.fuente