Existem alguns desafios neste site que solicitam que você imprima uma sequência, e isso não é exceção.
(A seguinte explicação da sequência para este desafio assume que os símbolos na sequência são 0
e 1
.)
A definição recursiva da sequência de Thue-Morse é que
T_0 = 0
T_2n = T_n
T_2n+1 = 1 - T_n
Uma definição mais directa é que a sequência a partir 0
de 2**m-1
e 2**m to 2**(m+1)-1
são complementos binários. Então 0
é seguido por 1
, 01
é seguido por 10
, 0110
é seguido por 1001
e, pulando um pouco adiante, 0110100110010110
é seguido por 1001011001101001
.
O desafio é escrever um programa ou uma função que imprima a sequência de Thue-Morse para os primeiros n
elementos, onde n
é qualquer número inteiro não negativo. A saída pode usar quaisquer dois símbolos, como mostrado nos exemplos abaixo.
Exemplos
>>> tm_01(20)
01101001100101101001
>>> tm_ab(42)
abbabaabbaababbabaababbaabbabaabbaababbaab
>>> tm_paren(37)
())()(())(()())()(()())(())()(())(()(
>>> tm_space_star(12)
** * ** *
>>> tm_01(0)
# to show that this is a valid input
Regras
A entrada será qualquer número inteiro não negativo. Você pode assumir que todas as entradas são válidas.
A saída deve ser o primeiro
n
elemento da sequência Thue-Morse, usando quaisquer símbolos que sejam convenientes. Se desejar, você também pode adicionar um separador. Nos meus exemplos, eu não tenho. Nota: Esta regra permite listas (como as do Python), como,
é um separador válido e não me importo com caracteres iniciais ou finais, como[
e]
na saída.Isso é código de golfe, então o menor número de bytes vence.
Como sempre, se o problema não estiver claro, entre em contato. Boa sorte e bom golfe!
Catálogo
var QUESTION_ID=65549;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var OVERRIDE_USER=47581;var answers=[],answers_hash,answer_ids,answer_page=1,more_answers=true,comment_page;function answersUrl(index){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(index,answers){return"http://api.stackexchange.com/2.2/answers/"+answers.join(';')+"/comments?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){answers.push.apply(answers,data.items);answers_hash=[];answer_ids=[];data.items.forEach(function(a){a.comments=[];var id=+a.share_link.match(/\d+/);answer_ids.push(id);answers_hash[id]=a});if(!data.has_more)more_answers=false;comment_page=1;getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){data.items.forEach(function(c){if(c.owner.user_id===OVERRIDE_USER)answers_hash[c.post_id].comments.push(c)});if(data.has_more)getComments();else if(more_answers)getAnswers();else process()}})}getAnswers();var SCORE_REG=/<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;var OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(a){return a.owner.display_name}function process(){var valid=[];answers.forEach(function(a){var body=a.body;a.comments.forEach(function(c){if(OVERRIDE_REG.test(c.body))body='<h1>'+c.body.replace(OVERRIDE_REG,'')+'</h1>'});var match=body.match(SCORE_REG);if(match)valid.push({user:getAuthorName(a),size:+match[2],language:match[1],link:a.share_link,});else console.log(body)});valid.sort(function(a,b){var aB=a.size,bB=b.size;return aB-bB});var languages={};var place=1;var lastSize=null;var lastPlace=1;valid.forEach(function(a){if(a.size!=lastSize)lastPlace=place;lastSize=a.size;++place;var answer=jQuery("#answer-template").html();answer=answer.replace("{{PLACE}}",lastPlace+".").replace("{{NAME}}",a.user).replace("{{LANGUAGE}}",a.language).replace("{{SIZE}}",a.size).replace("{{LINK}}",a.link);answer=jQuery(answer);jQuery("#answers").append(answer);var lang=a.language;lang=jQuery('<a>'+lang+'</a>').text();languages[lang]=languages[lang]||{lang:a.language,lang_raw:lang.toLowerCase(),user:a.user,size:a.size,link:a.link}});var langs=[];for(var lang in languages)if(languages.hasOwnProperty(lang))langs.push(languages[lang]);langs.sort(function(a,b){if(a.lang_raw>b.lang_raw)return 1;if(a.lang_raw<b.lang_raw)return-1;return 0});for(var i=0;i<langs.length;++i){var language=jQuery("#language-template").html();var lang=langs[i];language=language.replace("{{LANGUAGE}}",lang.lang).replace("{{NAME}}",lang.user).replace("{{SIZE}}",lang.size).replace("{{LINK}}",lang.link);language=jQuery(language);jQuery("#languages").append(language)}}
body{text-align:left!important}#answer-list{padding:10px;width:290px;float:left}#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table>
Respostas:
Pitão, 6 bytes
Experimente online: Demonstração
Com base na solução de @ThomasKwa e uma variação de @FryAmTheEggman.
Ele utiliza o seguinte formular: o
i
dígito -ésimo na sequência Thue-Morse é:xor(digits of i in base 2)
.Explicação:
fonte
CJam,
179 bytesou
Teste aqui.
Explicação
Isso usa a definição alternativa dada na Wikipedia, com base na paridade do número de
1
s na representação binária do arquivon
.A solução alternativa costuma
,
se transformarn
explicitamente em um intervalo[0 ... n-1]
antes de usar operadores infix para calcular as representações binárias e o XOR sem precisar de um bloco.Soluções de bônus
Aqui estão algumas soluções baseadas em outras definições. Se houver duas soluções, a mais curta explodirá a memória muito rapidamente (porque a pré-computação gera
2^n
bits antes de truncar paran
).Como um sistema L com
0 --> 01
e1 --> 10
:Negando e anexando a parte anterior:
Usando a relação de recorrência apresentada no desafio, use
divmod
e XOR para distinguir entre as duas definições recursivas:(Embora, é claro, essa relação de recorrência seja apenas uma maneira diferente de expressar a sequência de Thue-Morse como a paridade dos 1 bits na representação binária de
n
.)fonte
42
(assumindo um conjunto de bits) seria bastante irracional.:^
me faz feliz. Em outra nota, caramba, isso é um algoritmo legal.:^}
?Dyalog APL,
87 bytesEste é um trem monádico que espera uma origem de índice de 0 (
⎕IO←0
). A função não-trem equivalente é{≠⌿(⍵⍴2)⊤⍳⍵}
.Explicação:
Saída é uma lista separada por espaços de
0
e1
. Experimente aqui .fonte
Mathematica,
3521 bytesO Mathematica possui um built-in para a sequência Thue-Morse!
Resposta original:
fonte
LabVIEW, 15 primitivas do LabVIEW
agora como gif super chique com uma sonda
fonte
J,
1211 bytes@ MartinBüttner salvou um byte.
Esta é uma função monádica (ou seja, unária), usada da seguinte maneira:
Explicação
Estou usando a definição alternativa de que T n é a paridade do número de 1 bits na representação binária de n.
fonte
{.(,-)^:]
funciona para 9 bytes com algum alongamento de regra ( que foi permitido ). Por exemplo, para5
saídas5 _5 _5 5 _5
. (Adicionado apenas como um comentário por causa da regra de alongamento.)Pitão,
1110 bytesSaídas como uma lista no estilo Python.
fonte
F
porque procurei por 'reduzir'. Você pode postar como CW ...Japonês ,
2911 bytesExperimente online!
Produz diretamente como uma matriz, que economiza cerca de 4 bytes.
Ungolfed e explicação
Editar: agora você pode usar o seguinte código de 8 bytes (não válido; recurso publicado após este desafio):
fonte
Haskell,
393635 bytesExperimente online!
Como funciona: comece com
[0]
e aplique os tempos dex ++ invert x
funçãon
. Pegue os primeirosn
elementos da lista resultante. Graças à preguiça de Haskell, apenas os primeirosn
elementos são realmente calculados. Nota: o primeiro<*>
está no contexto da função, o segundo no contexto da lista.Com o GHC v8.4 (que não estava disponível no momento do desafio), há uma solução de 34 bytes:
Edit: -3 resp. -4 bytes graças a @Laikoni. -1 byte graças a @ Ørjan Johansen.
fonte
(\x->x++map(1-)x)
pode ser reduzido para([id,(1-)]<*>)
ou(id<>map(1-))
com o GHC 8.4.take<*>(iterate([id,(1-)]<*>)[0]!!)
Haskell, 54 bytes
Menos compacto que a solução de nimi, mas eu não queria negar a você essa parte da ofuscação do código funcional. Funciona para qualquer par de objetos; por exemplo, você pode substituir
(f 0.f 1)
por(f 'A'.f 'B')
.Com base na definição de que os primeiros 2 n dígitos são seguidos pela mesma sequência de dígitos invertidos. O que fazemos é criar duas listas lado a lado; um para a sequência, um para o inverso. Anexamos continuamente partes cada vez mais longas de uma lista à outra.
A implementação consiste em três definições:
A função
t
aceita qualquer número e retorna a sequência Thue-Morse desse comprimento. As outras duas funções são ajudantes.f
representa uma das listas;f 0
é para a sequência,f 1
para o inverso.g
cuida de acrescentar repetições cada vez mais longas de uma lista à outra.Fiddle: http://goo.gl/wjk9S0
fonte
Pari / GP , 33 bytes
Experimente online!
fonte
Burlesco, 21 bytes
Exemplos:
Explicação:
Sem a
jri.+
parte, você ficará sem memória (porque calculará a sequência morse de um número incrivelmente grande ). Mas como Burlesque é preguiçoso, apenas pedir o primeiro n-elemento funcionará de qualquer maneira.fonte
K5,
2713 bytesCalcular a sequência é bastante fácil, o problema é evitar o cálculo excessivo. Podemos reconhecer que a fácil expansão da sequência nos dá uma sequência de cordas que são potências sucessivas de duas de comprimento. Tomar a base de log 2 da entrada e arredondar para cima nos dará o suficiente para trabalhar e, em seguida, podemos reduzi-la ao tamanho apropriado:
Editar:
Uma solução baseada em paridade:
Em ação:
Observe que, como o K5 não possui uma primitiva arbitrária de conversão para binário, preciso especificar, por exemplo, uma decodificação de 64 bits. O K5 não usa matemática de precisão arbitrária; portanto, haverá um limite para o tamanho das entradas com as quais podemos lidar em qualquer caso.
fonte
Oitava,
3331 bytesEconomizou 2 bytes graças a Thomas Kwa.
fonte
Perl 5,
6249 bytesSim, não é o melhor idioma para este, mas ainda gosto do jeito que ele saiu. Requer 5.14+ para
/r
esay
.O uso da definição de paridade requer 5,12+ para
say
:fonte
Prolog (SWI), 115 bytes
Código:
Explicado:
Exemplo:
Experimente online aqui
fonte
Retina ,
7069 bytesUsando a definição como um sistema L com palavras
0
e produções iniciais0 --> 01
e1 --> 10
.A entrada é recebida em unário .
Você pode executar o código de um único arquivo com o
-s
sinalizador. Ou apenas tente online.Explicação
Anexa
0;
à entrada, onde0
está a palavra inicial e;
é apenas um separador.A
(
indica que este é o início de um laço (que se repete até que o circuito deixa de alterar a cadeia). Esse estágio se transforma0
e se transforma1
ema
eb
respectivamente (porque sed
expande para0-9
). Ele faz isso desde que a palavra atual (cujo comprimento é medido com(.)+
seja menor que a entrada (ou seja, desde que não possamos ler o final da string combinando tantos1
s quanto temos na palavra).Substitua
a
( substitua0
) por01
.Substitua
b
( substitua1
) por10
. Este também é o fim do loop. Os termina laço assim que as condições na fase transliteração falhar, porque então todas as0
s e1
s permanecerá inalterada e as outras duas fases não vai encontrar nada para corresponder.O último passo é truncar a palavra para o comprimento da entrada. Desta vez, medimos o comprimento da entrada
(.)+
em um lookahead. Em seguida, combinamos muitos caracteres desde o início da string.fonte
Ruby, 33
Ligue assim:
Usa o fato de que a paridade de números binários forma a sequência de três-morse.
O caractere separador é nova linha. Converte o número
i
em uma string binária e calcula a soma de todos os códigos ASCII, módulo 2.Se a nova linha não for um separador aceitável, o seguinte não terá separador para 2 bytes adicionais:
fonte
MATL , 9 bytes
Essa linguagem foi projetada após o desafio .
Abordagem 1: 13 bytes
Isso cria a sequência concatenando cópias negadas de blocos de tamanho crescente.
Exemplo
Explicação
Abordagem 2: 9 bytes
Isso usa a mesma abordagem que a resposta de Alefalpha .
Exemplo
Explicação
fonte
C,
8883 bytesCalcula a paridade para cada posição individual.
Fiddle: http://goo.gl/znxmOk
fonte
Gelatina , 4 bytes
Observe que esse desafio é mais antigo que o Jelly.
Experimente online!
Como funciona
fonte
Matlab, 42
Estou usando o fato de que é o mesmo que começar
0
e depois repetir o passo de acrescentar o complemento da série atual,n
vezes.fonte
, 11 caracteres / 23 bytes (não competitivo)
Try it here (Firefox only).
Os círculos são fortes com este.
fonte
Bash,
7166 bytesCom base na definição de que os primeiros 2 n dígitos são seguidos pela mesma sequência de dígitos invertidos.
$1
como parâmetro é o número desejado de dígitos.Fiddle: http://goo.gl/RkDZIC
fonte
Lote, 115 + 2 = 117 bytes
Com base na resposta do Bash.
Precisa de um extra
/V
na invocação para permitir o uso de!
s.fonte
ES6, 53 bytes
A recursão parecia mais simples que um loop.
fonte
Par , 8 bytes
Explicação:
Produz algo como:
fonte
Matemática ++ , 86 bytes
Usa
0.0\n
para 0 e1.0\n
para 1fonte
Arcyóu ,
5055 bytesEu tive que adicionar 5 bytes para fazê-lo funcionar corretamente :(
Explicação (com pseudocódigo Pythonesque ao lado:
fonte
Lisp comum , 50 bytes
Experimente online!
fonte