Em teoria do caos , o mapa de ferradura é um exemplo de como caos surge num simples processo de dobragem e esmagamento. É assim: pegue uma massa imaginária, dobre-a e, finalmente, amasse-a no tamanho original. O caos surge no padrão de como os pedaços de massa terminam no arranjo final após n iterações.
No nosso caso, veremos como um padrão binário simples se comporta quando dobramos e esmagamos . Aqui estão as etapas com um exemplo de 8 bits (a representação binária de 201 ou 11001001
).
Corte os bits em dois pedaços de igual comprimento (adicione um '0' no início, se houver um número ímpar de bits).
1100 | 1001
Dobre a primeira metade sobre a segunda metade. Observe que a ordem da primeira metade é invertida, à medida que a giramos enquanto dobra.
0011
1001
Squash para sua forma original. Enquanto esmagam, os bits superiores são deslocados para a esquerda para os bits sob sua posição original.
01001011
Se repetirmos este exemplo, podemos ver que, após 4 iterações, voltamos à cadeia de bits original:
Start bits: 11001001
Iteration 1: 01001011
Iteration 2: 01001101
Iteration 3: 01011001
Iteration 4: 11001001
Portanto, para o valor decimal de 201, o número de ciclos é 4.
O desafio
- Escreva um programa completo que use um número decimal como entrada e produza o número de ciclos necessários para repetir no processo bifurcado e dobrado binário descrito acima.
- A entrada (decimal) deve ser obtida de stdin (intervalo: de 1 a Googol ou 10 ^ 100).
- A saída (decimal) deve ser gravada em stdout.
- Sua pontuação é o número de bytes do seu código.
- Sua resposta deve começar com [Linguagem de programação] - [Pontuação em bytes]
- As brechas padrão não são permitidas.
Exemplos
7 --> 3
43 --> 5
178 --> 4
255 --> 1
65534 --> 1
65537 --> 12
1915195950546866338219593388801304344938837974777392666909760090332935537657862595345445466245217915 --> 329
Nota final
O interessante é que o número de ciclos está relacionado ao comprimento da representação binária, exceto por algumas exceções em que o número de ciclos é mais curto devido ao padrão na cadeia de bits (por exemplo, 111110
ciclos após 1 iteração). Isso cria uma oportunidade interessante para otimizar o comprimento do código usando o padrão subjacente em vez de calcular o número de ciclos.
Respostas:
CJam, 34 bytes
Nada extravagante, apenas aplica o mapa até retornarmos à entrada e imprimir o número de iterações realizadas.
Teste aqui.
fonte
Python 2,
175154149 bytesLink Ideone
Graças a agtoever por 27 bytes!
fonte
while i!=o|c==0
e solte oif i==o:break
. Salva 5. Talvez (note com certeza) que você também não precisaa
. Apenas usei
. Salva uma atribuição (4 bytes). Além disso, a atribuição de j pode ser colocada fora do loop.while i!=c|c==0
substituição, mas ainda consegui salvar alguns bytes com um padrão `ou`.Pitão, 21 bytes
Como estou digitando isso no meu telefone, notifique-me de quaisquer erros.
Experimente online.
fonte