Esse desafio colocou um algoritmo para codificar um número inteiro ncomo outro número inteiro r. A seguir, é apresentada uma explicação sucinta desse algoritmo, usando n=60como exemplo.
O algoritmo original
Primeiro, codificamos o número como uma sequência de colchetes.
- Se
n = 1, retorne uma string vazia. - Caso contrário, tomamos
na decomposição principal de ordem ordenada ascendente e substituímos cada elemento pelo seu índice principal (indexado 1) entre colchetes.60 = 2*2*3*5 => [1][1][2][3] - Faça isso recursivamente até tudo o que temos são colchetes.
[1][1][2][3] => [][][[1]][[2]] => [][][[]][[[1]]] => [][][[]][[[]]]
- Se
Depois de termos nossa cadeia de colchetes, convertemos isso em um número inteiro com o seguinte processo.
- Converta cada suporte de abertura em a
1e cada suporte de fechamento em a0.[][][[]][[[]]] => 10101100111000 - Remova todos os seixos finais
0e o final1.10101100111000 => 1010110011 - Converter a seqüência final do
0s e1s de binário para um número inteiro.1010110011 => 691
- Converta cada suporte de abertura em a
Decodificando esta codificação
Uma propriedade interessante desse algoritmo é que ele não é subjetivo. Nem todo número inteiro pode ser o resultado dessa codificação.
- Em primeiro lugar, a representação binária do resultado
rdeve estarbalance-ableem que o número de0s nunca deve exceder o número de1s. É um caso de teste curto de Falsey4, que é100binário. - Em segundo lugar, os colchetes na representação binária devem estar
sorted ascendingquando o final1e o final0são anexados mais uma vez. Um breve caso de teste de falsey é12 <= 1100 <= 110010 <= (())().
No entanto, apenas determinar se um número é decodificável dessa maneira seria um pequeno desafio. Em vez disso, o desafio é decodificar repetidamente uma determinada entrada até que um número não decodificável ou um ciclo seja alcançado e retorne a sequência resultante de números.
O desafio
- Dado um número
1 <= r <= 2**20 = 1048576, retorne a sequência de números querdecodifica sucessivamente , começando porrsi mesmo e terminando com um número ou um ciclo não decodificável. - Se um não decodificável for fornecido como entrada, como
4ou12, retornará uma lista contendo apenas a entrada. - Uma sequência que termina em um ciclo deve ser indicada de alguma forma, anexando ou anexando um marcador (escolha qualquer número inteiro não positivo, sequência, lista etc. como marcador, mas mantenha-o consistente) ou repetindo o ciclo em de alguma maneira (repetir o primeiro elemento, repetir todo o ciclo, repetir infinitamente, etc.).
- Com a chance de que qualquer uma das seqüências seja infinita (aumentando para sempre, por exemplo), considere esse comportamento indefinido.
- Isso é código de golfe. O menor número de bytes vence.
Um exemplo trabalhado de decodificação
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 teste
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]
Sugestões e comentários para esse desafio são bem-vindos. Boa sorte e bom golfe!
1dá 3?
1- (adicione um 1e zeros à direita) -> 1100-> [[]]-> [[1]]-> [2]->3
6-> 110-> 110100que não é válido, certo? Então, a entrada deve 1dar [1,3,5,6]?
7-> 111-> 11110000-> [[[[]]]]-> 4º primo = 7? Talvez eu não entendo o algoritmo