Beachten Sie, wenn ich "negieren" sage, meine ich, alle Einsen durch Nullen zu ersetzen (dh eine bitweise Negation)
Die Thue-Morse-Sequenz lautet 01101001
Die Art und Weise, wie Sie es generieren, ist:
Beginnen Sie mit 0. Negieren Sie, was noch übrig ist, und hängen Sie es an das Ende an.
Also, nimm 0
. Negiere es und füge das zum Ende hinzu -01
Dann nimm das und negiere es und füge es am Ende hinzu - 0110
Und so weiter.
Eine weitere interessante Eigenschaft ist, dass der Abstand zwischen Nullen eine "irrationale" und sich nicht wiederholende Zeichenfolge erzeugt.
Damit:
0110100110010110
|__|_||__||_|__|
2 1 0 2 01 2 <------------Print this!
Können Sie ein Programm schreiben, das bei Eingabe von n die ersten n Ziffern der zu druckenden Zeichenfolge ausgibt?
Dies ist Code Golf, also gewinnt die kürzeste Anzahl von Bytes!
Antworten:
Gelee, 9 Bytes
Probieren Sie es online aus!
Wie es funktioniert
quelle
Python
32,104928884 BytesDies ist eine ziemlich rudimentäre Lösung, die darauf basiert, eine ternäre Thue-Morse-Sequenz von Grund auf neu zu erstellen. Diese Sequenz ist identisch mit der angefragten, obwohl jemand anderes eine gründlichere Erklärung schreiben muss, warum das so ist. In jedem Fall ist diese Sequenz nur eine triviale Modifikation dieser Sequenz, A036580 .
Bearbeiten: Die for-Schleife wurde in ein Listenverständnis geändert, von einer Funktion in ein Programm geändert und das Ganze in Python 2 geändert. Vielen Dank an Dennis für die Hilfe beim Golfen.
quelle
Julia,
5650 BytesDies ist eine anonyme Funktion, die eine Ganzzahl akzeptiert und ein Ganzzahlarray zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.
Wir erzeugen die bitgetauschte Thue-Morse-Sequenz, indem
m = 1
wir mit einer ganzen Zahl beginnen , und hängen1-m
sie dannm
als Array-n+1
Zeiten an, wobein
die Eingabe ist. Dies erzeugt mehr Begriffe als wir brauchen. Wir lokalisieren dann diejenigen mitfind(m)
, ermitteln die Differenz zwischen aufeinanderfolgenden Werten mitdiff
und subtrahieren 1 elementweise. Wenn wir die erstenn
Terme des resultierenden Arrays nehmen, erhalten wir, was wir wollen.6 Bytes gespeichert und ein Problem dank Dennis behoben!
quelle
PowerShell, 102 Byte
Ein bisschen anders rechnen. PowerShell hat keine einfache Möglichkeit, "alle Indizes in diesem Array abzurufen, bei denen der Wert an diesem Index gleich so und so ist ", daher müssen wir etwas kreativ werden.
Hier verwenden wir A001969 , die "Zahlen mit einer geraden Anzahl von Einsen in ihrer binären Erweiterung", die völlig zufällig die Indizes der Nullen in der Thue-Morse-Sequenz angibt. ;-);
Der
filter
berechnet diese Zahl. Zum Beispielx 4
würde geben9
. Wir schleifen dann einfach von0
zu unserer Eingabe$args[0]
und subtrahieren,1
weil wir nullindiziert sind, und jede Iteration der Schleife druckt die Differenz zwischen der nächsten und der aktuellen Zahl aus. Die Ausgabe wird der Pipeline hinzugefügt und implizit mit Zeilenumbrüchen ausgegeben.Beispiel
quelle
Haskell, 42 Bytes
Anwendungsbeispiel:
(`take`l) 7
->[2,1,0,2,0,1,2]
.Es ist eine Implementierung
a036585_list
von A036585 nach unten verschoben zu0
,1
und2
. Golfen:concat (map f l)
istf =<< l
undf 0=[0,1,2]; f 1=[0,2]; f 2=[1]
ist([[0..2],[0,2],[1]]!!)
.Hinweis:
l
ist die unendliche Folge. Die Implementierung der Take-First-n
Elements-Funktion dauert 10 Byte oder etwa 25% .quelle
Mathematica,
796870 Bytesquelle
n<3
.MATL ,
1411 BytesProbieren Sie es online aus!
Wie @TimmyD in seiner Antwort hervorhob , ist die gewünschte Reihenfolge durch die aufeinanderfolgenden Unterschiede von A001969 gegeben . Letzteres kann wiederum als Thue-Morse-Sequenz plus 2 * n erhalten werden . Daher ist die gewünschte Sequenz gegeben durch (aufeinanderfolgende Unterschiede der Thue-Morse-Sequenz) plus eins .
Auf der anderen Seite ist die Morsefolge erhalten werden , wenn die Anzahl der Einsen in der binären Darstellung von n , ausgehend von n = 0 ist .
quelle
05AB1E ,
1413 BytesCode:
Erläuterung:
Probieren Sie es online aus!
quelle
Python, 69 Bytes
Der
i
dritte Term dieser Sequenz lautet1+t(i+1)-t(i)
: Wot
ist die Thue-Morse-Funktion? Der Code implementiert es rekursiv, was kürzer als istquelle
Mathematica, 65 Bytes
Schlägt meine andere Antwort, schlägt aber nicht die extra
scharfeGolfversion. Normalerweise stecke ich meinen Code in Anführungszeichen und ziehe ihn dann heraus, weil Mathematica es liebt, Ihrem Code Leerzeichen hinzuzufügen (die nichts bewirken), aber es wird nie mit Zeichenfolgen durcheinander gebracht, aber das funktioniert nicht für Code, der selbst Anführungszeichen enthält ...Wie auch immer, ich benutze nur die Magie, die dafür eingebaut ist. Die Ausgabe ist eine Zeichenfolge.
quelle
Mathematica, 58 Bytes
quelle
1;;#
kann durch einfach ersetzt werden;;#
.Position
.)Perl, 45 + 2 = 47 Bytes
Benötigt das
-p
und-a
Flag:Port von @ Sherlock9 Antwort
9 Bytes dank Ton gespart
quelle
-a
Option gibt Ihnen eine kostenlose Kopie der Eingabe, also$_=2;s/./(1,20,210)[$&]/ge until/.{@F}/;$_=$&
-p
mit speichern-E
:say$&
am Ende, wenn wir annehmen, dass Perl> v5.18JavaScript (ES6),
7367 BytePort of @ Sherlock9s Antwort.
Bearbeiten: 6 Bytes dank @WashingtonGuedes gespeichert.
quelle
!s[n]
anstelle von arbeitens.length<n
? Oder vielleicht nurs[n]
mit?:
invertiert?CJam (19 Bytes)
Online-Demo
Dies verwendet den Ansatz, die aufeinanderfolgenden Unterschiede zwischen Elementen der Thue-Morse-Sequenz zu erhöhen.
Mein kürzester Ansatz mit Umschreibregeln ist 21 Byte:
(Warnung: langsam). Dies codiert die Umschreibregeln
wie
quelle
Ruby, 57 Bytes
Eine Portierung von xnors Python-Antwort. Die Veränderungen liegen vor allem in der ternären Aussage in
t
anstelle desand
wegen0
sind truthy in Ruby und die Verwendung(1..n).map
und1+t[i]-t[i-1]
Bytes vs. speichern direkt auf die Liste Verständnis importieren.quelle
0
ist wahr? Wie funktioniert das??Mathematica (
fastnonverbal),107110 BytesDie Sequenz wird durch wiederholtes Anwenden einer Ersetzungsregel generiert. Eine andere Regel wandelt es in die gewünschte Ausgabe um. Wenn genügend Leute interessiert sind, werde ich im Detail erklären.
nicht alphanumerische Version
wie von CatsAreFluffy vorgeschlagen.
quelle
$
und ersetzen0
mitx-x
(wobei x eine nicht verwendete Sequenz von ist$
) (und die Nutzung(x-x)!
für 1 (dito)), wir werden alphanumerische frei.{x__}
anstelle von_[x__]
$[_]:=-/;
(beide durch Emulation der Gegenmaschine) Turing-vollständig ist