Dado un número entero positivo k > 1
y un número entero no negativo i
, genera una k
tupla (o k
vector dimensional) de números enteros no negativos. Para cada k
, el mapa de ℕ a ℕ k , debe ser biyectivo . Es decir, cada entrada i
debe 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 k
y i
pero 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 < 231
i
0
i
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
k
expansiones binarias en una leyendo cadak
dígito con diferentes desplazamientos. Por ejemplo, conk=3
, la entrada se357
asigna 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
q
actú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
g
aplica estosk-1
tiempos de biyección , expandiéndose de un solo elemento a un par a un triple ... a unak
tupla. 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-1
el segundo elemento para producir las entradas restantes.fuente