Observe que, quando digo "negar", quero dizer substituir todos os zeros (ou seja, uma negação bit a bit)
A sequência Thue-Morse é como 01101001
A maneira como você o gera é:
Comece com 0. Negue o que resta e anexe-o ao final.
Então pegue 0
. Negue e adicione isso ao final -01
Então pegue isso e negue e adicione isso até o fim - 0110
E assim por diante.
Outra propriedade interessante disso é que a distância entre zeros cria uma string "irracional" e não repetitiva.
Então:
0110100110010110
|__|_||__||_|__|
2 1 0 2 01 2 <------------Print this!
Você pode escrever um programa que, quando inserido n, produzirá os primeiros n dígitos da sequência a ser impressa?
Este é um código de golfe, e o menor número de bytes vence!
Respostas:
Geléia, 9 bytes
Experimente online!
Como funciona
fonte
Python
32,104928884 bytesEssa é uma solução bastante rudimentar, baseada na construção de uma sequência ternária de Thue-Morse do zero. Essa sequência é idêntica à que está sendo solicitada, embora outra pessoa precise escrever uma explicação mais completa do motivo. De qualquer forma, essa sequência é apenas uma modificação trivial dessa, A036580 .
Edit: Alterou o loop for para uma compreensão da lista, mudou de uma função para um programa e mudou tudo para Python 2. Agradecimentos a Dennis pela ajuda no golfe.
fonte
Julia,
5650 bytesEsta é uma função anônima que aceita um número inteiro e retorna uma matriz inteira. Para chamá-lo, atribua-o a uma variável.
Nós gerar a sequência Thue-Morse permutado bits, começando com um número inteiro
m = 1
, então anexamos1-m
am
como uma matrizn+1
vezes, onden
está a entrada. Isso gera mais termos do que precisamos. Em seguida, localizamos os que estão usandofind(m)
, obtemos a diferença entre valores consecutivos usandodiff
e subtraímos 1 elemento. Tomar os primeirosn
termos da matriz resultante nos dá o que queremos.Economizou 6 bytes e corrigiu um problema graças ao Dennis!
fonte
PowerShell, 102 bytes
Um pouco de uma maneira diferente de calcular. O PowerShell não tem uma maneira fácil de "obter todos os índices nessa matriz em que o valor nesse índice é igual a tal e tal ", portanto, precisamos ser um pouco criativos.
Aqui estamos usando A001969 , os "números com um número par de 1s em sua expansão binária", que completamente coincidentemente fornece os índices dos 0s na sequência Thue-Morse. ;-)
O
filter
calcula esse número. Por exemplo,x 4
daria9
. Simplesmente passamos0
para a entrada$args[0]
, subtraindo1
porque somos indexados a zero, e cada iteração do loop imprime a diferença entre o próximo número e o número atual. A saída é adicionada ao pipeline e a saída implicitamente com novas linhas.Exemplo
fonte
Haskell, 42 bytes
Exemplo de uso:
(`take`l) 7
->[2,1,0,2,0,1,2]
.É uma implementação
a036585_list
de A036585 deslocou para baixo para0
,1
e2
. Golfe:concat (map f l)
éf =<< l
ef 0=[0,1,2]; f 1=[0,2]; f 2=[1]
é([[0..2],[0,2],[1]]!!)
.Nota:
l
é a sequência infinita. São necessários 10 bytes ou cerca de 25% para implementar on
recurso take- first - element.fonte
Mathematica,
796870 bytesfonte
n<3
.MATL ,
1411 bytesExperimente online!
Conforme apontado por @TimmyD em sua resposta , a sequência desejada é dada pelas diferenças consecutivas de A001969 . Este último, por sua vez, pode ser obtido como a sequência de Thue-Morse mais 2 * n . Portanto, a sequência desejada é dada pelas (diferenças consecutivas da sequência de Thue-Morse) mais uma .
Por outro lado, a sequência de Thue-Morse pode ser obtida como o número de unidades na representação binária de n , começando em n = 0.
fonte
05AB1E ,
1413 bytesCódigo:
Explicação:
Experimente online!
fonte
Python, 69 bytes
O
i
termo th desta sequência é1+t(i+1)-t(i)
, ondet
está a função Thue-Morse. O código o implementa recursivamente, que é menor quefonte
Mathematica, 65 bytes
Supera minha outra resposta, mas não supera a versão extra-
picante dogolfe. Agora normalmente coloco meu código entre aspas e o retiro porque o Mathematica adora adicionar espaços ao seu código (que não fazem nada), mas nunca mexe com as strings, mas isso não funciona para o código que possui aspas ...Seja como for, eu só estou usando a mágica embutida para isso. Saída é uma string.
fonte
Mathematica, 58 bytes
fonte
1;;#
pode ser substituído por simplesmente;;#
.Position
.)Perl, 45 + 2 = 47 bytes
Requer o sinalizador
-p
e-a
:Porto de @ Sherlock9 answer
Economizou 9 bytes graças a Ton
fonte
-a
opção dá-lhe uma cópia gratuita da entrada, então$_=2;s/./(1,20,210)[$&]/ge until/.{@F}/;$_=$&
-p
com-E
:say$&
no final, se assumirmos que Perl> v5.18JavaScript (ES6),
7367 bytesPorto da resposta de @ Sherlock9.
editar: salvou 6 bytes graças a @WashingtonGuedes.
fonte
!s[n]
trabalhar no lugar des.length<n
? Ou talvez apenass[n]
com?:
invertido?CJam (19 bytes)
Demonstração online
Isso utiliza a abordagem de incrementar as sucessivas diferenças entre os elementos da sequência de Thue-Morse.
Minha abordagem mais curta usando regras de reescrita é 21 bytes:
(Aviso: lento). Isso codifica as regras de reescrita
Como
fonte
Ruby, 57 bytes
Uma porta da resposta Python do xnor. As mudanças se localizam principalmente na demonstração ternário em
t
no lugar doand
devido0
sendo truthy em Ruby, e usando(1..n).map
e1+t[i]-t[i-1]
para salvar bytes vs. importar a compreensão da lista diretamente.fonte
0
é verdade? Como isso funciona??Mathematica (
quasenão verbal),107110 bytesA sequência é gerada aplicando repetidamente uma regra de substituição. Outra regra a transforma na saída desejada. Se houver um número suficiente de pessoas interessadas, explicarei em detalhes.
versão não alfanumérica
como sugerido por CatsAreFluffy.
fonte
$
e substituí0
- las porx-x
(onde x é uma sequência não utilizada de$
) (e usar(x-x)!
para 1 (idem)), não teremos alfanuméricos.{x__}
vez de_[x__]
$[_]:=-/;
(ambos por emulação de contador de máquina)