Esse desafio colocou um algoritmo para codificar um número inteiro n
como outro número inteiro r
. A seguir, é apresentada uma explicação sucinta desse algoritmo, usando n=60
como 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
n
a 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
1
e cada suporte de fechamento em a0
.[][][[]][[[]]] => 10101100111000
- Remova todos os seixos finais
0
e o final1
.10101100111000 => 1010110011
- Converter a seqüência final do
0
s e1
s 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
r
deve estarbalance-able
em que o número de0
s nunca deve exceder o número de1
s. É um caso de teste curto de Falsey4
, que é100
binário. - Em segundo lugar, os colchetes na representação binária devem estar
sorted ascending
quando o final1
e o final0
sã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 quer
decodifica sucessivamente , começando porr
si 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
4
ou12
, 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!
1
dá 3
?
1
- (adicione um 1
e zeros à direita) -> 1100
-> [[]]
-> [[1]]
-> [2]
->3
6
-> 110
-> 110100
que não é válido, certo? Então, a entrada deve 1
dar [1,3,5,6]
?
7
-> 111
-> 11110000
-> [[[[]]]]
-> 4º primo = 7? Talvez eu não entendo o algoritmo