Introdução - O que é um colar?
Um colar é algo pelo qual as pessoas da OEIS são obcecadas. O desafio OEIS tem 5 sequências de colar.
Um colar binário de comprimento n
é um laço com n
contas que são 0
ou 1
. Dois colares são iguais se um pode ser girado para se tornar o outro, e dois colares reversíveis são os mesmos se um pode ser girado, revertido ou invertido e girado para se tornar o outro.
Um colar primitivo é aquele que não pode ser expresso como mais de uma cópia de um colar de contas encadeadas. Observe que as cópias devem ser montadas todas na mesma ordem (sem reversão) para que um colar seja considerado não primitivo.
Por exemplo, vamos dar uma olhada neste colar: 0 1 1 0 1 1
. Não é primitivo porque pode ser expresso como 0 1 1
repetido duas vezes. 0 1 0 1 1
é primitivo.
0 1 1 0
é primitivo porque 0 1
e 1 0
não é considerado a mesma sequência. Este colar é equivalente a, 1 1 0 0
porque pode ser girado à esquerda de uma conta para se tornar essa, mas não é equivalente a 0 1 0 1
(que não é primitivo a propósito).
Desafio
Dado um número inteiro não negativo n
, retorne o número de colares binários primitivos reversíveis distintos de comprimento n
. Entrada e saída como um único número inteiro cada.
Os primeiros termos dessa sequência são 1, 2, 1, 2, 3, 6, 8, 16, 24, 42, 69, 124, 208, 378, 668, 1214, 2220, 4110
indexados em 0.
Este é o OEIS A001371
Implementação de referência em Python 3 - bastante lenta
fonte
0 1 0 1
primitivo? Não é0 1
repetido duas vezes?Respostas:
Python 2 ,
178171139137 bytesExperimente online! Edit: Salvo
721 bytes graças a @HalvardHummel.fonte
JavaScript (ES6),
198192 bytesEu estava curioso para saber como seria uma resposta totalmente matemática. Então aqui está. Muito longo, mas muito rápido.
Demo
Mostrar snippet de código
Quão?
Isso se baseia nas seguintes fórmulas:
Onde φ é a função totiente de Euler e μ é a função Möbius .
Nota: Na versão atual, a segunda parte do código está agora diretamente incorporada em M () . Mas isso dificulta a leitura do código.
fonte
Mathematica,
12812512410999 bytesComo funciona
{0,1}~Tuples~#
localiza todas as seqüências binárias do comprimento especificadoU@Partition[#,L@#,1,1]&/@...
encontra todas as rotações possíveis de cada uma delasMaximalBy[...,L]
seleciona as entradas com as rotações mais distintas; estes correspondem aos colares primitivos.U[#,Reverse/@#]&/@...
coloca as rotações em cada entrada e suas reversões em uma ordem canônica ...(L=Length)@(U=Union)[...]
... para que possamos excluir colares primitivos duplicados e contar os elementos restantes.1~Max~...
garantimos que o resultado seja pelo menos 1 para acertar o termo zero.-2 bytes graças a Jonathan Frech e -2 graças a mim aprendendo com ele
-15 mais bytes da mudança para
MaximalBy
e alterações relacionadas-10 da mudança para
Partition
fonte
Length
comL
e definirL=Length;
, você poderia salvar um byte.==1
em um<2
.Casca , 21 bytes
Experimente online! O link mostra resultados de 0 a 10.
Explicação
fonte
Gelatina , 25 bytes
Experimente online!
Muito ineficiente.
fonte
Javascript (ES7), 180 bytes
Explicação:
fonte