Einführung
Natürlich haben wir viele Herausforderungen in Bezug auf Sequenzen. Hier ist eine andere.
Die Kimberling-Sequenz ( A007063 ) lautet wie folgt:
1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28, 22, ...
Dies wird durch Mischen der normalen Iteration erzeugt:
[1] 2 3 4 5 6 7 8
Der erste Term der Sequenz ist 1
. Danach mischen wir die Sequenz neu, bis alle Begriffe auf der linken Seite verwendet werden. Das Mischen hat das Muster right - left - right - left - ...
. Da links von keine Begriffe stehen 1
, wird nicht gemischt. Wir bekommen folgendes:
2 [3] 4 5 6 7 8 9
Bei der i- ten Iteration verwerfen wir das i- te Element und fügen es in unsere Sequenz ein. Dies ist die 2. Iteration, also verwerfen wir den 2. Punkt. Die Sequenz wird: 1, 3
. Für unsere nächste Iteration werden wir die aktuelle Iteration mit dem obigen Muster mischen. Wir nehmen den ersten unbenutzten Artikel rechts vom i- ten Artikel. Das ist zufällig so 4
. Wir werden dies an unsere neue Iteration anhängen:
4
Jetzt nehmen wir den ersten unbenutzten Gegenstand links vom i- ten Gegenstand. Das ist 2
. Wir werden dies an unsere neue Iteration anhängen:
4 2
Da links vom i- ten Element keine Elemente mehr vorhanden sind , wird der Rest der Sequenz an die neue Iteration angehängt:
4 2 [5] 6 7 8 9 10 11 ...
Dies ist unsere 3. Iteration, wir werden also das 3. Element verwerfen 5
. Dies ist der dritte Punkt in unserer Sequenz:
1, 3, 5
Um die nächste Iteration zu erhalten, wiederholen Sie einfach den Vorgang. Ich habe ein GIF gemacht, wenn es nicht klar ist:
Das GIF hat länger gedauert als das Schreiben des eigentlichen Posts
Aufgabe
- Bei einer nicht negativen Ganzzahl n werden die ersten n Terme der Sequenz ausgegeben
- Sie können eine Funktion oder ein Programm bereitstellen
- Das ist Code-Golf , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!
Testfälle:
Input: 4
Output: 1, 3, 5, 4
Input: 8
Output: 1, 3, 5, 4, 10, 7, 15, 8
Input: 15
Output: 1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28
Hinweis: Die Kommas in der Ausgabe sind nicht erforderlich. Sie können beispielsweise Zeilenumbrüche verwenden oder eine Liste usw. ausgeben.
Antworten:
Pyth, 22 Bytes
Probieren Sie es online aus: Demonstration
Führt einfach die im OP beschriebene Mischtechnik aus.
Erläuterung:
quelle
Julia,
7871 BytesDies ist eine unbenannte Funktion, die eine Ganzzahl akzeptiert und ein Ganzzahl-Array zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.
Der Ansatz hier ist derselbe wie bei OEIS.
Ungolfed:
7 Bytes gespart dank Mauris!
quelle
Mathematica 130 Bytes
Wir beginnen mit einer Liste, bestehend aus dem Bereich von
1
bis3x
, wox
die gewünschte Anzahl von Kimberling-Sequenztermen angegeben ist.Bei jedem Schritt
n
,TakeDrop
bricht die die aktuelle Liste in eine vordere Liste von2n+1
Begriffen (wo die Arbeit getan ist ) und hintere Liste (die später mit der verbunden werden Front Liste überarbeitet). Die vordere Liste wird mit dem folgenden Muster abgeglichen,{t___,z,r___}
wobei z der Kimberling-Begriff in der Mitte der vorderen Liste ist.r
isRiffle
'd mit der rückseite vont
und dann wird die hintere liste angehängt.z
wird entfernt und anAppendTo
die wachsende Kimberling-Sequenz angehängt .n
wird um inkrementiert1
und die aktuelle Liste wird von derselben Funktion über verarbeitetNest.
Beispiel
quelle
Python 2, 76 Bytes
Erläuterung
Dies ist die OEIS Formel nach vielen Golf-Transformationen! Es hat wunderbar geklappt . Der ursprüngliche Code war
Ich wurde zuerst los
i
, ersetzte es durcha+1
überall und erweiterte die Ausdrücke:Schreiben Sie dann
b<2*a-1
um-~b<2*a
, um ein Byte Leerzeichen zu speichern, und verschieben Sie das+1
in die Auswahl, Division durch 2 und Negation:Dann
-b-1
ist eben~b
so, dass wir schreiben können(b,~b)[b%2]
. Dies entspricht derb^0 if b%2 else b^-1
Verwendung des XOR-Operators oder alternativ dazub^b%-2
.quelle
Pyth,
2925 BytesJakube hat 4 Bytes gespart, aber ich habe keine Ahnung mehr, wie ich den Code lesen soll.
Hier ist die alte Lösung:
Übersetzung meiner Python-Antwort. Ich bin nicht sehr gut in Pyth, also gibt es vielleicht noch Möglichkeiten, dies zu verkürzen.
quelle
.W
aus 4 Bytes zum Golf:VQ+.W<hHyN-~tN/x%Z_2Z2hNN
..W
hat die Form:.W<condition><apply><start-value>
. Ich habe den Startwert verwendethN
, wie Sie es in getan habenKhN
..W
Ändert diesen Wert, solange der<condition>
true ist. Ich habe die gleiche Bedingung wie Sie verwendet<hHyN
. Die Bedingung ist eine Lambda-Funktion mit dem ParameterH
, so dass der aktuelle Wert (in Ihrem CodeK
) istH
. Und ich auch die gleiche verwendete<apply>
Aussage , wie Sie, ich nur ersetztK
mitZ
, weil die<apply>
Aussage eine Lambda-Funktion mit dem Parameter istZ
. Wir können das ignorieren=K
und damit.W
umgehen. Es ersetzt den alten Wert durch den berechneten. Am Ende drucken+...N
APL,
5644 BytesDies ist ein unbenannter monadischer Zug, der eine Ganzzahl auf der rechten Seite akzeptiert und ein Array zurückgibt. Es ist ungefähr der gleiche Ansatz wie meine Julia-Antwort .
Die innerste Funktion ist eine rekursive dyadische Funktion, die den n- ten Term in der Kimberling-Sequenz zurückgibt , wobei n als identisches linkes und rechtes Argument angegeben wird.
Auf diese Weise können wir individuelle Begriffe für die Sequenz ermitteln. Das Problem wird dann jedoch, dass dies eine dyadische Funktion ist, was bedeutet, dass Argumente auf beiden Seiten erforderlich sind. Geben Sie den
⍨
Operator ein! Wenn Sie eine Funktionf
und eine Eingabe angebenx
,f⍨x
ist dies dasselbe wiex f x
. In unserem Fallf
können wir unter Bezugnahme auf die oben genannte Funktion also den folgenden monadischen Zug konstruieren:Wir bewerben uns
f
auf jede Ganzzahl 1 auf die Eingabe an und erhalten ein Array.12 Bytes gespart dank Dennis!
quelle