Auf dieser Website gibt es eine Reihe von Herausforderungen, bei denen Sie aufgefordert werden, eine Sequenz auszudrucken. Dies ist keine Ausnahme.
(Bei der folgenden Erläuterung der Sequenz für diese Challenge wird davon ausgegangen, dass die Symbole in der Sequenz 0
und sind 1
.)
Die rekursive Definition der Thue-Morse-Sequenz lautet:
T_0 = 0
T_2n = T_n
T_2n+1 = 1 - T_n
Eine direktere Definition ist, dass die Reihenfolge von 0
bis 2**m-1
und 2**m to 2**(m+1)-1
binäre Komplemente sind. So 0
wird gefolgt von 1
, 01
gefolgt von 10
, 0110
gefolgt von 1001
, und, vorwärts springen ein wenig, 0110100110010110
wird gefolgt von 1001011001101001
.
Die Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, die die Thue-Morse-Sequenz für die ersten n
Elemente ausgibt, wobei n
es sich um eine beliebige nicht negative Ganzzahl handelt. Für die Ausgabe können zwei beliebige Symbole verwendet werden, wie in den folgenden Beispielen gezeigt.
Beispiele
>>> 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
Regeln
Die Eingabe ist eine beliebige nicht negative Ganzzahl. Sie können davon ausgehen, dass alle Eingaben gültig sind.
Die Ausgabe muss die ersten
n
Elemente der Thue-Morse-Sequenz sein, wobei alle Symbole verwendet werden, die zweckmäßig sind. Wenn Sie möchten, können Sie auch ein Trennzeichen hinzufügen. In meinen Beispielen habe ich nicht. Hinweis: Diese Regel erlaubt Listen (wie die von Python), da,
es sich um ein gültiges Trennzeichen handelt und es mir egal ist, ob Zeichen wie[
und]
in der Ausgabe vor- oder nachgestellt werden.Das ist Codegolf, also gewinnt die kleinste Anzahl von Bytes.
Wie immer, wenn das Problem unklar ist, lassen Sie es mich bitte wissen. Viel Glück und gutes Golfen!
Katalog
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>
Antworten:
Pyth, 6 Bytes
Probieren Sie es online aus: Demonstration
Basierend auf der Lösung von @ThomasKwa und einer Variante von @FryAmTheEggman.
Es verwendet das folgende Formular: die
i
-te Ziffer in der Morsefolge ist:xor(digits of i in base 2)
.Erläuterung:
quelle
CJam,
179 Bytesoder
Teste es hier.
Erläuterung
Hierbei wird die in Wikipedia angegebene alternative Definition verwendet, die auf der Parität der Anzahl der
1
s in der binären Darstellung der basiertn
.Die alternative Lösung verwendet
,
, umn
explizit in einen Bereich[0 ... n-1]
umzuwandeln, bevor Infix-Operatoren zum Berechnen der binären Darstellungen und des XOR verwendet werden, ohne dass ein Block erforderlich ist.Bonus-Lösungen
Hier finden Sie einige Lösungen, die auf anderen Definitionen basieren. Wenn es zwei Lösungen gibt, sprengt die kürzere sehr schnell den Speicher (da die Vorberechnung
2^n
vor dem Abschneiden auf Bits generiertn
).Als L-System mit
0 --> 01
und1 --> 10
:Durch Negieren und Anhängen des vorherigen Teils:
Verwenden Sie
divmod
und XOR, um anhand der in der Abfrage angegebenen Wiederholungsrelation zwischen den beiden rekursiven Definitionen zu unterscheiden:(Obwohl diese Wiederholungsbeziehung natürlich nur eine andere Art ist, die Thue-Morse-Sequenz als die Parität der 1-Bits in der binären Darstellung von auszudrücken
n
.)quelle
42
dass es ziemlich unvernünftig wäre, mehr als ein halbes Terabyte Speicher für die Berechnung der Ausgabe zu verwenden (vorausgesetzt, ein Bitset).:^
macht mich glücklich. Ein weiterer Punkt, heiliger Mist, das ist ein cooler Algorithmus.:^}
?Dyalog APL,
87 BytesDies ist ein monadischer Zug, der einen Indexursprung von 0 (
⎕IO←0
) erwartet . Die äquivalente Nichtzugfunktion ist{≠⌿(⍵⍴2)⊤⍳⍵}
.Erläuterung:
Die Ausgabe ist eine durch Leerzeichen getrennte Liste von
0
und1
. Probieren Sie es hier aus .quelle
Mathematica,
3521 BytesMathematica hat eine eingebaute für die Thue-Morse-Sequenz!
Ursprüngliche Antwort:
quelle
LabVIEW, 15 LabVIEW-Grundelemente
jetzt als super schickes gif mit sonde
quelle
J,
1211 Bytes@ MartinBüttner hat ein Byte gespeichert.
Dies ist eine monadische (dh unäre) Funktion, die wie folgt verwendet wird:
Erläuterung
Ich benutze die alternative Definition, dass T n die Parität der Anzahl der 1-Bits in der binären Darstellung von n ist.
quelle
{.(,-)^:]
Funktioniert für 9 Bytes mit einigem Rule Stretching ( was erlaubt wurde ). ZB dafür5
Ausgänge5 _5 _5 5 _5
. (Wurde nur als Kommentar hinzugefügt, da sich die Regeln dehnen.)Pyth,
1110 BytesAusgabe als Python-Liste.
quelle
F
weil ich nach "Reduzieren" gesucht habe. Sie könnten als CW ...Japt ,
2911 BytesProbieren Sie es online!
Gibt direkt als Array aus, wodurch ca. 4 Bytes eingespart werden.
Ungolfed und Erklärung
Bearbeiten: Sie können jetzt den folgenden 8-Byte- Code verwenden (nicht gültig; Feature veröffentlicht nach dieser Herausforderung):
quelle
Haskell,
393635 BytesProbieren Sie es online!
So funktioniert es: Beginnen Sie mit
[0]
und wenden Sie diex ++ invert x
-Funktionszeitenn
an. Nehmen Sie die erstenn
Elemente aus der resultierenden Liste. Dank Haskells Faulheit werden nur die erstenn
Elemente tatsächlich berechnet. Hinweis: Die erste<*>
befindet sich im Funktionskontext, die zweite im Listenkontext.Mit GHC v8.4 (das zum Zeitpunkt der Herausforderung noch nicht verfügbar war) gibt es eine 34-Byte-Lösung:
Bearbeiten: -3 resp. -4 Bytes dank @Laikoni. -1 Byte danke an @ Ørjan Johansen.
quelle
(\x->x++map(1-)x)
kann auf([id,(1-)]<*>)
oder(id<>map(1-))
mit GHC 8.4 gekürzt werden .take<*>(iterate([id,(1-)]<*>)[0]!!)
Haskell, 54 Bytes
Weniger kompakt als Nimis Lösung, aber ich wollte Ihnen diese funktionale Code-Verschleierung nicht verweigern. Funktioniert für jedes Paar von Objekten. zB kann man ersetzen
(f 0.f 1)
durch(f 'A'.f 'B')
.Basierend auf der Definition, dass auf die ersten 2 n Ziffern die gleiche Folge von invertierten Ziffern folgt. Wir bauen zwei Listen nebeneinander auf. eine für die Sequenz, eine für die Inverse. Wir hängen fortlaufend immer längere Teile einer Liste an die andere an.
Die Implementierung besteht aus drei Definitionen:
Funktion
t
akzeptiert eine beliebige Zahl und gibt die Thue-Morse-Sequenz dieser Länge zurück. Die beiden anderen Funktionen sind Helfer.f
repräsentiert eine der beiden Listen.f 0
ist für die Sequenz,f 1
für die Umkehrung.g
sorgt dafür, dass immer längere Wiederholungen einer Liste an die andere angehängt werden.Geige: http://goo.gl/wjk9S0
quelle
Pari / GP , 33 Bytes
Probieren Sie es online!
quelle
Burlesque, 21 Bytes
Beispiele:
Erläuterung:
Ohne den
jri.+
Teil wird Ihnen der Speicher ausgehen (weil dadurch die Morsefolge mit der unglaublich großen Länge berechnet wird ). Aber da Burlesque faul ist, funktioniert es trotzdem, nur nach dem ersten n-Element zu fragen.quelle
K5,
2713 BytesDie Berechnung der Sequenz ist ziemlich einfach, das Problem besteht darin, zu viel Rechenaufwand zu vermeiden. Wir können erkennen, dass die einfache Erweiterung der Folge uns eine Folge von Folgen ergibt, die aufeinanderfolgende Zweierpotenzen sind. Wenn wir die logarithmische Basis 2 der Eingabe nehmen und aufrunden, haben wir genug Zeit, um damit zu arbeiten. Dann können wir sie auf die entsprechende Größe zuschneiden:
Bearbeiten:
Eine paritätsbasierte Lösung:
In Aktion:
Beachten Sie, dass ich, da K5 keine willkürliche Umwandlung in ein binäres Grundelement hat, zum Beispiel eine 64-Bit-Dekodierung angeben muss. K5 verwendet keine willkürliche Präzisionsmathematik, so dass die Größe der Eingaben, mit denen wir uns auf jeden Fall befassen können, begrenzt ist.
quelle
Oktave,
3331 Bytes2 Bytes gespart dank Thomas Kwa.
quelle
Perl 5,
6249 BytesJa, nicht die beste Sprache für diese, aber ich mag immer noch die Art und Weise, wie sie herauskam. Benötigt 5.14+ für
/r
undsay
.Für die Verwendung der Paritätsdefinition ist 5.12+ erforderlich für
say
:quelle
Prolog (SWI), 115 Bytes
Code:
Erklärt:
Beispiel:
Probieren Sie es hier online aus
quelle
Retina ,
7069 BytesVerwendung der Definition als L-System mit Anfangswort
0
und Produktionen0 --> 01
und1 --> 10
.Die Eingabe erfolgt unär .
Sie können den Code aus einer einzelnen Datei mit dem
-s
Flag ausführen . Oder versuchen Sie es einfach online.Erläuterung
Stellt
0;
vor die Eingabe, wobei0
das Anfangswort und;
nur ein Trennzeichen ist.Das
(
zeigt an, dass dies der Anfang einer Schleife ist (die wiederholt wird, bis die Schleife aufhört, die Zeichenfolge zu ändern). Diese Phase selbst dreht0
und1
ina
undb
jeweils (weild
ausdehnt0-9
). Dies geschieht so lange, wie das aktuelle Wort (dessen Länge mit gemessen wird,(.)+
ist kürzer als die Eingabe1
).Ersetzen
a
(Ersatz für0
) durch01
.Ersetzen
b
(Ersatz für1
) durch10
. Dies ist auch das Ende der Schleife. Die Schleife wird beendet, sobald die Bedingung in der Transliterationsphase fehlschlägt, da dann alle0
s und1
s unverändert bleiben und die anderen beiden Phasen nichts Passendes finden.Der letzte Schritt ist das Abschneiden des Wortes auf die Länge der Eingabe. Dieses Mal messen wir die Länge der Eingabe mit
(.)+
einem Lookahead. Dann stimmen wir mit so vielen Zeichen ab dem Anfang der Zeichenfolge überein.quelle
Ruby, 33
Rufen Sie wie folgt an:
Verwendet die Tatsache, dass die Parität von Binärzahlen die Thue-Morse-Sequenz bildet.
Trennzeichen ist Newline. Wandelt die Zahl um
i
in eine Binärzeichenfolge um und berechnet dann die Summe aller ASCII-Codes, Modulo 2.Wenn newline kein akzeptables Trennzeichen ist, enthält Folgendes kein Trennzeichen für zusätzliche 2 Bytes:
quelle
MATL , 9 Bytes
Diese Sprache wurde nach der Herausforderung entworfen .
Ansatz 1: 13 Bytes
Dies baut die Sequenz auf, indem negierte Kopien von Blöcken mit zunehmender Größe verkettet werden.
Beispiel
Erläuterung
Ansatz 2: 9 Bytes
Dies verwendet den gleichen Ansatz wie Alephalphas Antwort .
Beispiel
Erläuterung
quelle
C,
8883 BytesBerechnet die Parität für jede einzelne Position.
Geige: http://goo.gl/znxmOk
quelle
Gelee , 4 Bytes
Beachten Sie, dass diese Herausforderung älter als Jelly ist.
Probieren Sie es online!
Wie es funktioniert
quelle
Matlab, 42
Ich benutze die Tatsache, dass es das Gleiche ist, als würde ich mit dem
0
Anhängen des Komplements der aktuellen Serie beginnen und diesen Schritt dann wiederholenn
.quelle
𝔼𝕊𝕄𝕚𝕟, 11 Zeichen / 23 Byte (nicht wettbewerbsfähig)
Try it here (Firefox only).
Die Kreise sind stark mit diesem.
quelle
Bash,
7166 BytesBasierend auf der Definition, dass auf die ersten 2 n Ziffern die gleiche Folge von invertierten Ziffern folgt.
$1
als parameter wird die gewünschte ziffernanzahl angegeben.Geige: http://goo.gl/RkDZIC
quelle
Batch, 115 + 2 = 117 Bytes
Basierend auf der Bash-Antwort.
Benötigt ein Extra
/V
im Aufruf, um die Verwendung von!
s zu ermöglichen .quelle
ES6, 53 Bytes
Rekursion schien einfacher als eine Schleife.
quelle
Par , 8 Bytes
Erläuterung:
Gibt so etwas aus wie:
quelle
Math ++ , 86 Bytes
Verwendet
0.0\n
für 0 und1.0\n
für 1quelle
Arcyóu ,
5055 BytesIch musste 5 Bytes hinzufügen, damit es richtig funktioniert :(
Erklärung (mit Pythonesque-Pseudocode an der Seite:
quelle
Common Lisp , 50 Bytes
Probieren Sie es online!
quelle