Este desafío planteó un algoritmo para codificar un entero n
como otro entero r
. Lo que sigue es una explicación sucinta de ese algoritmo, utilizando n=60
como ejemplo.
El algoritmo original
Primero, codificamos el número como una cadena de corchetes.
- Si
n = 1
, devuelve una cadena vacía. - De lo contrario, tomamos
n
la descomposición primaria ordenada de forma ascendente y reemplazamos cada elemento con su índice principal (1 índice) entre paréntesis.60 = 2*2*3*5 => [1][1][2][3]
- Haga esto de forma recursiva hasta que todo lo que tengamos sean paréntesis.
[1][1][2][3] => [][][[1]][[2]] => [][][[]][[[1]]] => [][][[]][[[]]]
- Si
Una vez que tenemos nuestra cadena de corchetes, la convertimos en un entero con el siguiente proceso.
- Convierta cada soporte de apertura en ay
1
cada soporte de cierre en a0
.[][][[]][[[]]] => 10101100111000
- Elimine todos los
0
s finales y el final1
.10101100111000 => 1010110011
- Convertir la cadena final de
0
s y1
s de binario a un entero.1010110011 => 691
- Convierta cada soporte de apertura en ay
Decodificando esta codificación
Una propiedad interesante de este algoritmo es que es no sobreyectiva. No todos los enteros pueden ser el resultado de esta codificación.
- En primer lugar, la representación binaria del resultado
r
debe estarbalance-able
en que el número de0
s nunca debe exceder el número de1
s. Un breve caso de prueba de falsey es4
, que está100
en binario. - En segundo lugar, los corchetes en la representación binaria deben estar
sorted ascending
cuando los s finales1
y finales0
se agregan una vez más. Un breve caso de prueba de falsey es12 <= 1100 <= 110010 <= (())()
.
Sin embargo, solo determinar si un número es decodificable de esta manera sería un pequeño desafío. En cambio, el desafío consiste en decodificar repetidamente una entrada dada hasta que se alcance un número que no se puede decodificar o un ciclo, y devolver la secuencia de números resultante .
El reto
- Dado un número
1 <= r <= 2**20 = 1048576
, devuelve la secuencia de números que ser
decodifica sucesivamente , comenzando porr
sí mismo y terminando con un número o ciclo no decodificable. - Si se proporciona un número que no se puede decodificar como entrada, como
4
o12
, devolverá una lista que solo contiene la entrada. - Una secuencia que termina en un ciclo debe indicarse de alguna manera, ya sea agregando o anteponiendo un marcador (elija un entero no positivo, cadena, lista, etc. como marcador, pero manténgalo consistente), o repitiendo el ciclo en de alguna manera (repitiendo el primer elemento, repitiendo todo el ciclo, repitiendo infinitamente, etc.).
- En el caso de que cualquiera de las secuencias sea infinita (por ejemplo, aumentando para siempre), considérelo comportamiento indefinido.
- Este es el código de golf. El menor número de bytes gana.
Un ejemplo trabajado de decodificación
1 -> 1 -> 1100 -> [[]] -> [2] -> 3
-> 3 -> 11 -> 111000 -> [[[]]] -> [[2]] -> [3] -> 5
-> 5 -> 101 -> 101100 -> [][[]] -> 2*[2] -> 2*3 -> 6
-> 6 -> 110 -> 110100 -> [[][]] -> [2*2] -> [4] -> 7
-> 7 -> 111 -> 11110000 -> [[[[]]]] -> [[[2]]] -> [[3]] -> [5] -> 11
-> 11 -> 1011 -> 10111000 -> [][[[]]] -> 2*[[2]] -> 2*[3] -> 2*5 -> 10
-> 10 -> 1010 -> 101010 -> [][][] -> 2*2*2 -> 8
-> 8 -> 1000 ERROR: Unbalanced string
Casos de prueba
4 -> [4]
12 -> [12]
1 -> [1, 3, 5, 6, 7, 11, 10, 8]
2 -> [2, 4]
13 -> [13, 13] # cycle is repeated once
23 -> [23, 22, 14, 17]
51 -> [51, 15, 31, 127, 5381]
691 -> [691, 60]
126 -> [126, 1787, 90907]
1019 -> [1019, 506683, 359087867, 560390368728]
Las sugerencias y comentarios para este desafío son bienvenidos. ¡Buena suerte y buen golf!
1
da 3
?
1
- (agregue un 1
y ceros al final) -> 1100
-> [[]]
-> [[1]]
-> [2]
->3
6
-> 110
-> 110100
que no es válido, ¿verdad? Entonces, ¿debería la entrada 1
dar [1,3,5,6]
?
7
-> 111
-> 11110000
-> [[[[]]]]
-> 4th prime = 7? Tal vez no entiendo el algoritmo