Il y a pas mal de défis sur ce site qui vous demandent d'imprimer une séquence, et cela ne fait pas exception.
(L'explication suivante de la séquence de ce défi suppose que les symboles de la séquence sont 0
et 1
.)
La définition récursive de la séquence de Thue-Morse est que
T_0 = 0
T_2n = T_n
T_2n+1 = 1 - T_n
Une définition plus directe est que la séquence de 0
à 2**m-1
et 2**m to 2**(m+1)-1
sont des compléments binaires. Ainsi 0
est suivi par 1
, 01
est suivi par 10
, 0110
est suivi par 1001
, et, en sautant un peu, 0110100110010110
est suivi par 1001011001101001
.
Le défi consiste à écrire un programme ou une fonction qui imprime la séquence Thue-Morse pour les premiers n
éléments, où n
est tout entier non négatif. La sortie peut utiliser deux symboles quelconques, comme indiqué dans les exemples ci-dessous.
Exemples
>>> 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
Règles
L'entrée sera un entier non négatif. Vous pouvez supposer que toutes les entrées sont valides.
La sortie doit être les premiers
n
éléments de la séquence Thue-Morse, en utilisant tous les symboles qui conviennent. Si vous le souhaitez, vous pouvez également ajouter un séparateur. Dans mes exemples, je ne l'ai pas fait. Remarque: Cette règle autorise les listes (comme celles de Python), tout comme,
un séparateur valide et cela ne me dérange pas les caractères de début ou de fin, tels que[
et]
dans la sortie.C'est le golf de code, donc le plus petit nombre d'octets gagne.
Comme toujours, si le problème n'est pas clair, faites-le moi savoir. Bonne chance et bon golf!
Catalogue
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>
Réponses:
Pyth, 6 octets
Essayez-le en ligne: Démonstration
Basé sur la solution de @ThomasKwa et une variante de @FryAmTheEggman.
Il utilise le formulaire ci : le
i
chiffre -ième dans la séquence Thue-Morse est la suivante :xor(digits of i in base 2)
.Explication:
la source
CJam,
179 octetsou
Testez-le ici.
Explication
Ceci utilise la définition alternative donnée sur Wikipedia, basée sur la parité du nombre de
1
s dans la représentation binaire dun
.La solution alternative utilise
,
pour se transformern
explicitement en une plage[0 ... n-1]
avant d'utiliser des opérateurs infixes pour calculer les représentations binaires et le XOR sans avoir besoin d'un bloc.Solutions bonus
Voici quelques solutions basées sur d'autres définitions. S'il existe deux solutions, la plus courte fera exploser la mémoire très rapidement (car le précalcul génère des
2^n
bits avant de tronquern
).En tant que système L avec
0 --> 01
et1 --> 10
:En niant et en ajoutant la partie précédente:
En utilisant la relation de récurrence donnée dans le défi, en utilisant
divmod
et XOR pour faire la distinction entre les deux définitions récursives:(Bien que, bien sûr, cette relation de récurrence soit juste une manière différente d'exprimer la séquence Thue-Morse comme la parité des 1 bits dans la représentation binaire de
n
.)la source
42
(en supposant un jeu de bits) serait assez déraisonnable.:^
me rend heureux. Sur une autre note, merde sacrée, c'est un algorithme cool.:^}
?Dyalog APL,
87 octetsIl s'agit d'un train monadique qui attend une origine d'index de 0 (
⎕IO←0
). La fonction non-train équivalente est{≠⌿(⍵⍴2)⊤⍳⍵}
.Explication:
La sortie est une liste séparée par des espaces de
0
et1
. Essayez-le ici .la source
Mathematica,
3521 octetsMathematica a une fonction intégrée pour la séquence Thue-Morse!
Réponse originale:
la source
LabVIEW, 15 primitives LabVIEW
maintenant comme gif super fantaisie avec une sonde
la source
J,
1211 octets@ MartinBüttner a enregistré un octet.
Il s'agit d'une fonction monadique (signifiant unaire), utilisée comme suit:
Explication
J'utilise la définition alternative que T n est la parité du nombre de 1 bits dans la représentation binaire de n.
la source
{.(,-)^:]
fonctionne sur 9 octets avec un étirement des règles ( qui a été autorisé ). Par exemple, pour les5
sorties5 _5 _5 5 _5
. (Ajouté uniquement en tant que commentaire en raison de l'étirement de la règle.)Pyth,
1110 octetsSorties sous forme de liste de style Python.
la source
F
parce que je cherchais «réduire». Vous pouvez poster en tant que CW ...Japt ,
2911 octetsEssayez-le en ligne!
Produit directement sous forme de tableau, ce qui économise environ 4 octets.
Non golfé et explication
Modifier: Vous pouvez maintenant utiliser le code 8 octets suivant (non valide; fonctionnalité publiée après ce défi):
la source
Haskell,
393635 octetsEssayez-le en ligne!
Comment ça marche: commencez
[0]
et appliquez lax ++ invert x
fonctionn
fois. Prenez les premiersn
éléments de la liste résultante. Grâce à la paresse de Haskell, seuls les premiersn
éléments sont réellement calculés. Remarque: le premier<*>
est en contexte de fonction, le second en contexte de liste.Avec GHC v8.4 (qui n'était pas disponible au moment du défi), il existe une solution à 34 octets:
Modifier: -3 resp. -4 octets grâce à @Laikoni. -1 octet grâce à @ Ørjan Johansen.
la source
(\x->x++map(1-)x)
peut être raccourci vers([id,(1-)]<*>)
ou(id<>map(1-))
avec GHC 8.4.take<*>(iterate([id,(1-)]<*>)[0]!!)
Haskell, 54 octets
Moins compact que la solution de nimi, mais je ne voulais pas vous refuser ce brouillage du code fonctionnel. Fonctionne pour n'importe quelle paire d'objets; par exemple, vous pouvez remplacer
(f 0.f 1)
par(f 'A'.f 'B')
.Basé sur la définition que les 2 premiers n chiffres sont suivis de la même séquence de chiffres inversés. Ce que nous faisons, c'est construire deux listes côte à côte; un pour la séquence, un pour l'inverse. Nous ajoutons continuellement des parties de plus en plus longues d'une liste à l'autre.
L'implémentation se compose de trois définitions:
La fonction
t
accepte n'importe quel nombre et renvoie la séquence Thue-Morse de cette longueur. Les deux autres fonctions sont des aides.f
représente l'une ou l'autre liste;f 0
est pour la séquence,f 1
pour l'inverse.g
se charge d'ajouter des répétitions de plus en plus longues d'une liste à l'autre.Violon: http://goo.gl/wjk9S0
la source
Pari / GP , 33 octets
Essayez-le en ligne!
la source
Burlesque, 21 octets
Exemples:
Explication:
Sans la
jri.+
partie, vous manquerez de mémoire (car elle calculera la séquence morse de longueur d' un nombre incroyablement énorme ). Mais comme Burlesque est paresseux, le simple fait de demander le premier élément n fonctionnera de toute façon.la source
K5,
2713 octetsCalculer la séquence est assez facile, le problème évite de trop calculer. Nous pouvons reconnaître que l'expansion facile de la séquence nous donne une séquence de chaînes qui sont des puissances successives de deux longueurs. Prendre la base de journal 2 de l'entrée et l'arrondir nous donnera suffisamment de travail et nous pourrons ensuite le réduire à la taille appropriée:
Modifier:
Une solution paritaire:
En action:
Notez que puisque K5 n'a pas de primitive de conversion arbitraire en binaire, je dois spécifier, par exemple, un décodage 64 bits. K5 n'utilise pas de mathématiques de précision arbitraires, il y aura donc une limite à la taille des entrées que nous pouvons traiter dans tous les cas.
la source
Octave,
3331 octetsEnregistré 2 octets grâce à Thomas Kwa.
la source
Perl 5,
6249 octetsOuais, ce n'est pas la meilleure langue pour celui-ci, mais j'aime toujours la façon dont c'est sorti. Nécessite 5.14+ pour
/r
etsay
.L'utilisation de la définition de parité nécessite 5.12+ pour
say
:la source
Prolog (SWI), 115 octets
Code:
Expliqué:
Exemple:
Essayez-le en ligne ici
la source
Rétine ,
7069 octetsUtilisation de la définition comme un L-système avec mot initial
0
et productions0 --> 01
et1 --> 10
.L'entrée est prise en unaire .
Vous pouvez exécuter le code à partir d'un seul fichier avec l'
-s
indicateur. Ou essayez-le simplement en ligne.Explication
Ajoute
0;
à l'entrée, où0
est le mot initial et;
n'est qu'un séparateur.Le
(
indique qu'il s'agit du début d'une boucle (qui se répète jusqu'à ce que la boucle cesse de changer la chaîne). Cette étape elle-même se transforme0
et1
devienta
etb
respectivement (car sed
développe en0-9
). Il le fait aussi longtemps que le mot actuel (dont la longueur est mesurée avec(.)+
est plus court que l'entrée (c'est-à-dire tant que nous ne pouvons pas lire la fin de la chaîne en faisant correspondre autant de1
s que nous en avons dans le mot).Remplacez
a
(remplaçant0
) par01
.Remplacez
b
(remplaçant1
) par10
. C'est aussi la fin de la boucle. La boucle se termine une fois que la condition de l'étape de translittération échoue, car alors tous les0
s et1
s resteront inchangés et les deux autres étapes ne trouveront rien à faire correspondre.La dernière étape consiste à tronquer le mot à la longueur de l'entrée. Cette fois, nous mesurons la longueur de l'entrée avec
(.)+
dans une anticipation. Ensuite, nous faisons correspondre autant de caractères depuis le début de la chaîne.la source
Rubis, 33
Appelez comme ceci:
Utilise le fait que la parité des nombres binaires forme la séquence thue-morse.
Le caractère séparateur est une nouvelle ligne. Convertit le nombre
i
en une chaîne binaire, puis calcule la somme de tous les codes ASCII, modulo 2.Si la nouvelle ligne n'est pas un séparateur acceptable, ce qui suit n'a pas de séparateur pour 2 octets supplémentaires:
la source
MATL , 9 octets
Cette langue a été conçue après le défi .
Approche 1:13 octets
Cela construit la séquence en concaténant des copies négatives de blocs de taille croissante.
Exemple
Explication
Approche 2: 9 octets
Cela utilise la même approche que la réponse d'Alephalpha .
Exemple
Explication
la source
C,
8883 octetsCalcule la parité pour chaque position individuelle.
Violon: http://goo.gl/znxmOk
la source
Gelée , 4 octets
Notez que ce défi est plus ancien que Jelly.
Essayez-le en ligne!
Comment ça marche
la source
Matlab, 42
J'utilise le fait que c'est la même chose que de commencer par
0
, puis de répéter l'étape d'ajout du complément de la série actuelle,n
fois.la source
𝔼𝕊𝕄𝕚𝕟, 11 caractères / 23 octets (non concurrentiel)
Try it here (Firefox only).
Les cercles sont forts avec celui-ci.
la source
Bash,
7166 octetsSur la base de la définition selon laquelle les 2 premiers n chiffres sont suivis de la même séquence de chiffres inversés.
$1
comme paramètre est le nombre de chiffres souhaité.Violon: http://goo.gl/RkDZIC
la source
Lot, 115 + 2 = 117 octets
Basé sur la réponse Bash.
Nécessite un supplément
/V
dans l'invocation pour permettre l'utilisation du par!
.la source
ES6, 53 octets
La récursivité semblait plus simple qu'une boucle.
la source
Par , 8 octets
Explication:
Produit quelque chose comme:
la source
Math ++ , 86 octets
Utilise
0.0\n
pour 0 et1.0\n
pour 1la source
Arcyóu ,
5055 octetsJ'ai dû ajouter 5 octets pour que cela fonctionne correctement :(
Explication (avec pseudocode Pythonesque sur le côté:
la source
Lisp commun , 50 octets
Essayez-le en ligne!
la source