Wir beginnen mit einer leeren 1-indizierten Sequenz:
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,...
Im n- ten Schritt füllen wir alle a (n) -Leerzeichen mit den ganzen Zahlen größer als 1 aus, beginnend mit dem ersten verbleibenden Leerzeichen, wobei a (n) der n- te Eintrag in der Sequenz ist.
Nach dem ersten Schritt:
2,_,3,_,4,_,5,_,6,_,7,_,8,_,9,_,10,_,11,_,12,_,13,_,...
Beachten Sie, dass a (1) 2 sein muss, da die erste ganze Zahl größer als 1 2 ist.
Im zweiten Schritt füllen wir alle a (2) Lücken aus. Es ist offensichtlich, dass a (2) 2 sein muss.
2,2,3,_,4,3,5,_,6,4,7,_,8,5,9,_,10,6,11,_,12,7,13,_,...
Im dritten Schritt füllen wir alle a (3) Lücken aus. Aus der Folge ist a (3) = 3.
2,2,3,2,4,3,5,_,6,4,7,_,8,5,9,3,10,6,11,_,12,7,13,_,...
Im vierten Schritt füllen wir alle a (4) Lücken aus. Aus der Folge ist a (4) = 2.
2,2,3,2,4,3,5,2,6,4,7,_,8,5,9,3,10,6,11,3,12,7,13,_,...
Schließlich:
2,2,3,2,4,3,5,2,6,4,7,2,8,5,9,3,10,6,11,3,12,7,13,2,...
Aufgabe
Bei n wird das n- te Element der Sequenz zurückgegeben.
Die ersten 10.000.000 Begriffe der Sequenz finden Sie hier .
Das ist Code-Golf . Kürzeste Antwort in Bytes gewinnt. Es gelten Standardlücken .
Antworten:
Haskell ,
8067 BytesProbieren Sie es online!
Haskell ist die perfekte Sprache, um eine unendliche Liste in sich selbst zu definieren.
quelle
let
Pattern Guards nicht vertraut sind.pattern1 | let pattern2 = expr2 = expr1
bedeutet dasselbe wiepattern1 = let pattern2 = expr2 in expr1
(aus demselben Grund[expr1 | let pattern2 = expr2]
bedeutet das dasselbe wie[let pattern2 = expr2 in expr1]
).let
Pattern Guards erinnern (vor allem daran, dass sie Funktionen ausführen können)! Außerdemm=2:2:2`drop`g m
ist ein Byte kürzer.(!!)$0:m
ist zwei Bytes kürzer.2:2:
Zeug mit etwas mehr Faulheit ganz fallen lassen:g ~(a:b)|...
undm=g m
.C, 123 Bytes
Probieren Sie es online!
Komplettlösung
Ordnen Sie ein Array mit n Ganzzahlen zu, um die ersten n Elemente der Sequenz zu speichern . Diese Hardcodes
sizeof(int)
wie4
, die eine sichere Annahme in den meisten Fällen und sicherlich ein Ich bin bereit , im Rahmen des Code Golf zu machen. :)Dies sind alles Zähler:
i
für den Index des Schritts, auf dem wir uns befinden,j
um die Sequenz zu durchlaufen undk
nach leeren Stellen zu suchen und um zu zählen, wie viele leere Stellen gesehen wurden.Bevor wir unsere Hauptschleife starten, schleichen wir uns in einer Initialisierung der ersten beiden Elemente der Sequenz an
2
. (p[0]
=*(p + 0)
=*p
.) Das wirft zwar die Zählung abk
, aber ...... führen wir auch eine hinterhältige Initialisierung von durch
k
, bei der überprüft wird, ob der Werti
kleiner als ist,2
und der Startwert von korrigiert wird,k
wenn dies der Fall ist. Hier beginnt auch die innere Schleife, die bei jedem Schritt die gesamte bisherige Sequenz durchläuft.Diese Zeile könnte eine Erklärung gebrauchen. Wir können dies erweitern auf:
durch Kurzschließen und dann durch De Morgans Gesetze und die Tatsache, dass
0
in C falsch ist:Dies bedeutet im Wesentlichen: "Wenn dieser Bereich leer ist, erhöhen Sie ihn
k
. Wenn erk
zuvor ein Vielfaches der Schrittgröße war, führen Sie die folgende Anweisung aus." Daher führen wir die Anweisung für jedes Element der Schrittgröße aus , und genau so wird die Sequenz beschrieben. Die Aussage selbst ist einfach; alles wird es generieren2
,3
,4
, ....Unter Verwendung des tricky-return-without-a-return, mit dem gearbeitet wird
gcc
, "geben" wir das letzte Element der ersten n Terme in der Sequenz zurück, das zufällig der n- te Term ist.quelle
Pyth, 29 Bytes
Probieren Sie es online aus
Wie es funktioniert
Anstatt mit Listen herumzuspielen, wird eine einfache rekursive Formel verwendet.
quelle
Haskell , 67 Bytes
Probieren Sie es online!
Eine rekursive arithmetische Lösung, die im Grunde die gleiche Methode ergab wie Anders Kaseorgs Pyth-Antwort .
Dieser Code ist mit Warzen bedeckt - hässliche Teile, die aussehen, als könnten sie weggolfen werden, aber ich habe nicht gesehen, wie.
Die Funktion
i%j
möchte wirklich einen Wächter verwenden, um zu prüfen, obmod i(f j)>0
einer der beiden entsprechenden Ausdrücke vorliegt, und um sie auszuwerten. Aber beide Ausdrücke verwendendiv i(f j)
. Wenn Sie das in einer Wache binden, wird es nicht auf beide Seiten zutreffen. Soweit ich weiß, kann eine Wache nicht dazu gebracht werden, sich über andere Wachen zu "verteilen".let
undwhere
sind zu lang. Der Codelast
wählt also einen von zwei Ausdrücken aus, während der Guard die Variable bindet. Pfui.Idealerweise würden wir verwenden,
divMod
weil sowohl dasdiv
alsmod
auch verwendet werden, aber es(d,m)<-divMod ...
ist ein langer Ausdruck. Wir überprüfen stattdessen, ob der Mod ungleich Null ist, indem wir prüfen, ob derdiv
Wert mal dem Divisor unter dem ursprünglichen Wert liegt.Der
0%j=2
Fall wäre nicht nötig, wenn Haskell kurzgeschlossen würdediv 0
, was nicht der Fall ist. Das.pred
konvertiert den 1-indizierten Eingang in einen Null-indizierten, sonst würde es-1
überall Korrekturen geben.quelle
%
1-indiziert schalten , benötigen Sie eine 5-Byte-Korrektur, die nur bindet. Allerdings können Sie dann inlinef
in%
ohne Kosten, und dannf
wird anonym , so dass Sie insgesamt zwei Bytes speichern.f
ohne Bytes zu verlieren.divMod
scheint ein Byte billiger zu sein, weil es das Verzweigen mit erlaubt!!(0^m)
. Bisher habe ich:1%j=2;i%j|(d,m)<-divMod(i-1)$j%1=[(i-d-1)%(j+1),d+2]!!(0^m);(%1)
.pred
.JavaScript (ES6),
989391 ByteEine rekursive Funktion, die stoppt, sobald das Ergebnis verfügbar ist.
Alternative Version, 90 Byte
Vorgeschlagen von Shaggy für -1 Byte
Dieser muss mit gerufen werden
f(n)()
. Obwohl der entsprechende Beitrag in Meta derzeit eine positive Bewertung ergibt, ist diese Syntax offenbar umstritten.Demo
Code-Snippet anzeigen
quelle
n=>g=(p,a=[...Array(n)])=>a[n-1]||g(-~p,a.map(c=>c?c:i?i++%k?c:++v:(i=1,v=2),i=0,k=a[p]||2))
sollte für 92 Bytes funktionieren. Nennen Sie es mitf(n)()
.Java 8, 124 Bytes
Lambda-Ausdruck.
Erstellt ein ganzzahliges Array und füllt es kontinuierlich auf, bis der n-te Wert gefüllt wird.
Das Vordeklarieren von Variablen oben, um so viele Deklarationen wie möglich zu vermeiden,
int
kostet 4 Byte Speicherplatz, während das Hinzufügen von,n
2 Byte erforderlich ist.Bei der
j
'ten Iteration der Berechnung ist die Anzahl der zu überspringenden' Leerzeichen gleicha[j]
(oder 2, wenn leer). Es stellt sich heraus, dass, wenn die erste Lücke, die wir ausfüllen müssen, an der Position istk
,k * a[j]
wir den 'Schritt' (s
) erhalten.quelle