Betrachten Sie die folgende Reihenfolge:
0 1 3 2 5 4 8 6 7 12 9 10 11 17 13 14 15 16 23 ...
Sieht ziemlich musterlos aus, oder? So funktioniert das. Beginnen Sie mit 0
, springen Sie n
ganzzahlig auf, und n
beginnen Sie mit 1
. Das ist die nächste Nummer in der Sequenz. Fügen Sie dann alle "übersprungenen" Zahlen hinzu, die noch nicht in aufsteigender Reihenfolge angezeigt wurden. Dann inkrementieren n
und von der letzten angehängten Zahl springen. Wiederholen Sie dieses Muster.
Wenn wir zum Beispiel erreichen 11
, sind wir bei n=5
. Wir erhöhen n
sein n=6
, springen bis zu 17
, dann append 13 14 15 16
da diese noch nicht gesehen worden. Unser nächster Sprung ist n=7
, also ist das nächste Element in der Sequenz 23
.
Die Herausforderung
Geben Sie bei gegebener Eingabe x
den x
dritten Ausdruck dieser Sequenz und die ersten x
Ausdrücke der Sequenz aus oder erstellen Sie eine unendliche Liste der Ausdrücke der Sequenz. Sie können zwischen 0- und 1-Indexierung wählen.
I / O und Regeln
- Die Eingabe und Ausgabe kann durch jede bequeme Methode erfolgen .
- Es kann davon ausgegangen werden, dass die Eingabe und Ausgabe in den Native Number-Typ Ihrer Sprache passt.
- Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
- Standardlücken sind verboten.
- Dies ist Codegolf, daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
Antworten:
JavaScript (ES7), 41 Byte
Gibt den n-ten Term der Sequenz mit dem Index 0 zurück.
Probieren Sie es online!
Wie?
Hauptfall:n > 3
Die ersten vier Terme der Sequenz sind etwas Besonderes. Lassen Sie uns sie daher zunächst beiseite legen.
Für sieht die Sequenz so aus:n > 3
Wir können feststellen, dass es tatsächlich zwei verschachtelte Teilsequenzen gibt:
Die meisten Werte gehören zur Subsequenz für die wir einfach haben:EIN
Einige andere Werte gehören zur Subsequenz (im obigen Diagramm mit Klammern markiert), deren Indizes der arithmetischen Sequenz 3, 3, 4, 6, 9, 13, 18, 24 folgen ... und für die wir haben:B
wobei der Index in der Hauptreihe und ist der Index in der Subsequenz .k Bn k B
Die Indizes von in der Hauptsequenz sind gegeben durch:B
Wenn , wissen wir, dass der entsprechende Term in der Hauptsequenz zu gehört, wenn eine ganzzahlige Lösung der quadratischen Gleichung ist:B nn B n
dessen Diskriminante ist:
und dessen positive Lösung ist:
Wir erwarten, dass eine ganze Zahl ist. Daher der Test:Δ--√
Sonderfälle:0 ≤ n ≤ 3
Für ist die Diskriminante negativ und ihre Quadratwurzel ergibt NaN . Für ist die Diskriminante . Daher wird angenommen, dass diese ersten vier Terme der Sequenz zur Teilsequenz .n < 3 n = 3 1 B
Wenn wir nur unsere Standardformel n - ~ d / 2 anwenden , erhalten wir:
anstatt:
Aus diesem Grund XOR wir diese Ergebnisse mit .0 , 1 , 2 und 1
quelle
Schale , 12 Bytes
Probieren Sie es online!
Ausgaben als unendliche Liste. Hier ist eine Version, die das erste N ausgibt .
Erläuterung
quelle
Haskell , 43 Bytes
Probieren Sie es online!
Definiert eine unendliche Liste:
quelle
Gelee , 15 Bytes
Dies ist ein vollständiges Programm, das bei n die ersten n Elemente der Sequenz ausgibt.
Probieren Sie es online!
Wie es funktioniert
quelle
C (gcc)
736764 BytesProbieren Sie es online!
Definiert eine Funktion
f
, die 0-indiziert istn
und dien
th-Zahl in der Sequenz erzeugt.Wir können die Sequenz wie folgt analysieren:
Zuerst behandeln wir den Mittelteil:
Beachten Sie, dass die Argumente auf der linken Seite (4, 6, 9, 13, ...) einem Muster folgen: Zuerst zwei, dann drei, dann vier usw. hinzufügen. Wir beginnen bei
t=4
und addierend
(was bei 2 beginnt) jede Iteration der Schleife, wobei wir inkrementierend
.Der Körper der Schleife ist interessanter. Denken Sie daran, dass wir 4 bis 5, 6 bis 8, 9 bis 12 usw. abbilden möchten. das ist nur das Hinzufügen ,
d-1
wennx
istt
. Diese Logik kommt jedoch vor dem letzten Fall,f(n) = n - 1
sodass wir wissen, dass wir am Ende 1 subtrahieren werden. Deshalb können wir einfachd
ifx == t
(x-t||(x+=d)
) hinzufügen . Wir werden jedoch auch unmittelbar danach brechen aus der Schleife müssen - also fügen wir , dass aufd
die absurd aussehenden zu bekommend+=x+=d
, die immer das machend<x
Bedingung scheitern.Dies umfasst alles außer den ersten vier Werten. Wenn wir sie in Binärform betrachten, erhalten wir:
Also wollen wir das letzte bisschen umdrehen, wenn
2 <= x < 4
. Dies geschieht mitx^x/2
.x/2
ergibt das zweitniedrigstwertige Bit, also wird durch XOR-Verknüpfung mit der ursprünglichen Nummer das letzte Bit umgedreht, wenn die Nummer 2 oder 3 ist.quelle
Jelly ,
1310 Bytes-3 Dank an Dennis (speichere mit der 0-Indizierung 2 aus dem kumulativen Summenaufbau und einer abschließenden Dekrementierung)
Ein monadischen Link auf eine ganze Zahl ist , Akzeptieren 0 -indexed n , die eine ganze Zahl zurückgibt, a (n)
Probieren Sie es online! Oder sehen Sie sich eine Testsuite an
quelle
ḶÄ+3i+’
aber keine Ahnung, wie ich mit den Randfällen umgehen soll.Ḷ»ạ¥3
fürḊ3,2;
- fühlt sich an wie es knappere für dieses Bit sein sollte.Ḷ»2Äi+_>2$
Spart 3 Bytes mit 0-basierter Indizierung.Perl 5 mit
-pl
70 BytesProbieren Sie es online!
quelle
MATL , 22 Bytes
Gibt die ersten
n
Terme der Sequenz aus.Probieren Sie es online!
Erläuterung
quelle
Haskell , 51 Bytes
Probieren Sie es online!
Etwas länger als Lynns Haskell-Antwort , aber der andere Ansatz könnte trotzdem interessant sein.
quelle
Ruby , 73 Bytes
Probieren Sie es online!
Rekursive Funktion, die die ersten x-Nummern der Liste zurückgibt.
quelle
QBasic, 58 Bytes
Ausgänge auf unbestimmte Zeit. Möglicherweise möchten Sie eine
SLEEP 1
innerhalb der Schleife hinzufügen oder esLOOP WHILE b<100
oder so etwas machen, um die Ergebnisse zu sehen.Dies implementiert im Grunde nur die Spezifikation. Beachten Sie, dass die Nummern, für die wir zurückgehen, immer die Nummern zwischen der zuletzt angesprungenen Nummer und der zuvor angesprungenen Nummer sind. Also speichern wir diese Grenzen als
a
undb
und verwenden eineFOR
Schleife, um alle Zahlen zwischen ihnen auszudrucken.quelle
05AB1E , 14 Bytes
Probieren Sie es online!
quelle
R , 70 Bytes
Probieren Sie es online!
F
Konstante dank @JAD-Vorschlagsetdiff
anstelle vonx[x %in% y]
Vorherige Version (79 Bytes)
quelle
5 bytes
wird eine Reihe von Warnungen gespeichert und ausgelöst!F/T
bei der Funktionsdefinition nicht neu definiert werden. Es ändert nicht (IIRC) den globalen Wert fürF/T
Python 2 , 123 Bytes
Probieren Sie es online!
Bei Eingabe von x werden die ersten x Terme der Sequenz ausgegeben.
Ich lerne Python und diese Herausforderungen machen die Dinge interessanter.
Edit: etwas Whitespace rasieren
quelle
for n in range(1,z) if len(s) < z]; return s
:for n in range(1,z)if len(s)<z];return s
.Gelee , 16 Bytes
Probieren Sie es online!
Ein Byte länger als die existierende Jelly-Antwort, aber dies könnte möglicherweise ein wenig golfen werden.
RÄṬŻk²Ḋ$
könnte vielleicht kürzer sein.18 Bytes
Länger aber anders.
quelle
Ruby , 63 Bytes
Probieren Sie es online!
0-indiziert. Kann wohl runtergolfen werden.
quelle
Perl 6 , 52 Bytes
Probieren Sie es online!
Dies ist ein Generatorausdruck, der den
...
Operator verwendet. Es sucht nach Lücken in der vorherigen Reihenfolge@_
über((^max @_)∖@_).min.?key
:Das
?
ist notwendig für den Anfangswert, der kein.key
. Wenn keine Lücken gefunden werden, wird n (hier in der$
Variablen) zum letzten Wert in der Liste addiert , plus eins für off by 0 error.quelle
Python 3 , 104 Bytes
Probieren Sie es online!
Bei Eingabe von x werden die ersten x "Folgen" ausgegeben
quelle