Imagine um "fio" que tenha n
espaços. Imagine ainda que existem "elétrons" nesse fio. Esses elétrons vivem apenas uma unidade de tempo. Quaisquer espaços no fio adjacentes a exatamente um elétron se tornam um elétron. Na terminologia de Game of Life, é isso B1/S
.
Por exemplo, este é um fio de comprimento 10, com período 62.
Regras
- Input,,
n
é um número inteiro único positivo. - A saída deve ser um número inteiro único que denota o período de um fio de comprimento n.
- O estado inicial é um único elétron em uma extremidade do fio.
- O período não inclui necessariamente o estado inicial. Alguns comprimentos nunca retornam ao estado inicial, mas todos são periódicos.
- Um fio estático (ou seja, um sem elétrons) tem o período 1.
- As condições de contorno não são periódicas. Ou seja, o fio não é toroidal de forma alguma.
Casos de teste
Agradecimentos especiais ao orlp por produzir esta lista. (Eu verifiquei até n = 27).
1 1
2 2
3 1
4 6
5 4
6 14
7 1
8 14
9 12
10 62
11 8
12 126
13 28
14 30
15 1
16 30
17 28
18 1022
19 24
20 126
21 124
22 4094
23 16
24 2046
25 252
26 1022
27 56
28 32766
29 60
30 62
31 1
32 62
33 60
34 8190
35 56
36 174762
37 2044
38 8190
39 48
40 2046
41 252
42 254
43 248
44 8190
45 8188
Você pode ver casos de teste de n = 2 a 21 aqui com meu simulador de jogo da vida: Variações da vida .
EDIT: a sequência aqui foi publicada como A268754 !
code-golf
cellular-automata
El'endia Starman
fonte
fonte
2^n-1
, porque esse é o número de possíveis estados diferentes de zero de o "fio"The period does not necessarily include the starting state. Some lengths never return to the starting state, but all of them are periodic.
Você tem um exemplo?Respostas:
Python 2,
14814287 bytesUsa o algoritmo de detecção de ciclo do Brent e, portanto, é executado rapidamente.
Também escrevi uma animação em Python (ambos os trabalhos 2 e 3). Ele precisa
pyglet
correr. Você pode ver a animação executando:(Sinta-se à vontade para fazer o download da essência e inspecionar o código antes de executar.) Você pode pressionar as teclas + e - para aumentar / diminuir o n sendo visualizado.
E, finalmente, para os interessados em explorar ainda mais essa sequência numérica, aqui está uma versão legível (usada para gerar os casos de teste acima):
fonte
Mathematica, 127 bytes
Explicação
Artigo 18 :
Casos de teste
fonte
Python 2, 68 bytes
A detecção do ciclo poderia ser melhor, mas a etapa iterativa é agradável.
Ao representar a matriz como um número binário
k
, a atualização pode ser feita retirando o XOR dek
um para a esquerda/2
e outro para a direita e*2
, em seguida, truncando paran
bytes como%2**n
.fonte
Python
32,134121118 bytesBasicamente, o mesmo que a minha resposta Pyth , mas a adaptou um pouco por causa da falta de certas funções internas no Python.
Versão não destruída:
fonte
Pitão,
3936 bytesUsa a função "ponto fixo cumulativo" para iterar até pouco antes de a configuração se repetir e retorna todas as configurações intermediárias como uma lista de listas. Isso funciona porque as regras são determinísticas e a configuração da próxima geração é uma função da configuração atual. Isso significa que quando a mesma configuração aparecer novamente, os autômatos concluíram um ciclo.
Depois de atingir isso (a última iteração do ciclo), ele chama a função de próxima geração uma última vez no último elemento da lista "history", para obter a próxima configuração (que é a configuração inicial de um ciclo) e encontre seu índice na história. Agora, o período é simplesmente a duração (1 + índice de final do ciclo) menos o índice de início do ciclo.
No pseudocódigo pitônico:
O conjunto de testes leva muito tempo para que o servidor o mate, portanto, você precisará usar o programa regular e testá-lo um por um, ou instalar o Pyth (se não tiver) e usar um script para testá-lo.
fonte
Geléia,
191817 bytesEsse código calcula os primeiros 2 n estados, portanto, não é particularmente rápido ou eficiente em termos de memória ...
Experimente online! ou verifique os 16 primeiros casos de teste .
Versão alternativa, 13 bytes (não concorrente)
As versões do Jelly que pós-datam esse desafio têm detecção de loop integrada, permitindo uma solução mais curta e mais eficiente.
Isso lida com o último caso de teste com facilidade. Experimente online!
Como funciona
Observe que o link auxiliar é aplicado a 2 n na primeira iteração, que não codifica um estado válido. No entanto, ((2 n ÷ 2) ^ (2 n × 2))% 2 n = (2 n - 1 + 2 n + 1 )% 2 n = 2 n - 1 , que é um dos possíveis estados iniciais.
Como fazemos um loop 2 n + 1 vezes, temos a garantia de encontrar um estado duas vezes, tornando a detecção do loop bem-sucedida.
fonte
CJam,
4134312725 bytesAgradecimentos a Dennis por salvar 3 bytes. Tomar emprestada uma idéia de sua resposta Jelly salvou outras 4.
Teste aqui.
Explicação
Estou representando o fio simplesmente como um número inteiro (cujos bits indicam as posições dos elétrons) em vez de usar uma lista real de bits. O estado é atualizado por meio de cálculos bit a bit bastante simples.
Para encontrar o período em que coletamos todos os resultados intermediários na pilha, execute a simulação para 2 etapas n-1 +1 e determine o período como o número de elementos desde a última ocorrência do estado final (mais 1).
Aqui está um detalhamento do código:
fonte
JavaScript (ES6) 99
104Teste
fonte
Haskell, 170 bytes
x!p
fornece o elemento no índice p se estiver dentro dos limites, caso contrário, 0.n
calcula o próximo passo.g i
dá oi
passo th.c x
fornece o período, se começar comx
.f
envolve tudo junto.(Nota: postado no telefone que possui o intérprete de abraços, que não possui todos os recursos, pode haver erros de digitação.)
fonte
MATL ,
38373635 bytesIsso usa um loop que continua computando novos estados até que o novo estado seja igual a qualquer um dos anteriores. Cada estado é um vetor de zeros e uns. Esses vetores são armazenados como linhas de uma matriz 2D crescente.
A computação de cada novo estado é feita através da convolução do estado atual com a sequência
[1,0,1]
, mantendo apenas a parte central e definindo0
qualquer entrada que não seja1
.EDIT (13 de maio de 2016) O código no link a seguir foi ligeiramente modificado de acordo com as alterações introduzidas no idioma após a redação desta resposta
Experimente online!
fonte
Perl 6, 81 bytes
Expandido e não destruído um pouco
Um pouco de explicação:
[op]
reduz a lista usando op. Por exemplo[+] @list
, somará@list
R
é uma meta-op que reverte os argumentos dados a uma op. Por exemplo1 R- 3
, resultará em 2.fonte
C ++, 211 bytes
Golfe
Com espaço em branco adicional para facilitar a leitura
Boas práticas para o conjunto de bits do C ++; e um ótimo aprendizado educacional sobre o algoritmo de detecção de ciclo de Brent (usado pelo @orlp)
fonte
Pitão, 95 bytes
Você pode experimentá-lo aqui .
fonte
Pitão, 29 bytes
Usa o algoritmo
a(n+1) = ((a(n) << 1)^(a(n) >> 1)) % (2 ** N)
.fonte
Ruby, 72 bytes
Função anônima.
fonte