Geben Sie den N-ten Term der Van-Eck-Sequenz aus.
Van-Eck-Sequenz ist definiert als:
- Beginnt mit 0.
- Wenn der letzte Term das erste Vorkommen dieses Terms ist, ist der nächste Term 0.
- Wenn der letzte Begriff zuvor aufgetreten ist, gibt der nächste Begriff an, um wie viele Schritte zurück der letzte aufgetreten ist.
https://www.youtube.com/watch?v=etMJxB-igrc
https://www.youtube.com/watch?v=8VrnqRU7BVU
Reihenfolge: 0,0,1,0,2,0,2,2,1,6,0,5,0,2, ...
Tests:
Eingabe | Ausgabe
- 1 | 0
- 8 | 2
- 19 | 5
- 27 | 9
- 52 | 42
- 64 | 0
BEARBEITEN
1 indiziert ist bevorzugt, 0 indiziert ist akzeptabel; Das könnte einige der bereits eingereichten Lösungen ändern.
Nur das neunte Semester bitte.
Gleich (mit Ausnahme des bereits veröffentlichten Teils), scheint es, dass Codegolfer und Numberphile-Beobachter eine anständige Überlappung haben.
n
Semester?Antworten:
JavaScript (ES6),
46 4137 ByteProbieren Sie es online!
Wie?
Wir müssen nicht die gesamte Sequenz speichern. Wir müssen nur die letzte Position jeder Ganzzahl verfolgen, die in der Sequenz erscheint. Wir verwenden dazu das der rekursiven Funktion zugrunde liegende Objekt .G
Für einen gegebenen Term brauchen wir auf seine tatsächliche absolute Position in der Sequenz zu setzen, weil uns nur die Entfernung mit der aktuellen Position interessiert. Deshalb können wir nur den aktuellen Wert des Eingangs speichern , der als Dekrementierungszähler im Code verwendet wird.p G[ p ] n
Daher ist der Abstand durch . Günstigerweise ergibt dies NaN, wenn dies das erste Auftreten von , das leicht in die erwartete .G[ p ] - n p 0p 0
Kommentiert
quelle
Python 3 ,
696362 BytesProbieren Sie es online!
Hinweis: Wie Erik der Outgolfer erwähnte, funktioniert dieser Code auch in Python 2 einwandfrei.
0-indiziert (obwohl Sie es, nur um absolut pervers zu sein, -1-indizieren können, indem Sie
if n
zuif~n
: P wechseln )Nutzt Pythons großartigen "Sternoperator" zum rekursiven Aufbau der Serie, bis
n
Null erreicht ist.Die Funktion baut die Serie in umgekehrter Reihenfolge auf, um zu vermeiden, dass sie für die Suche umgekehrt werden muss. Außerdem werden die Negationen aller Elemente gespeichert, da das Zurückkonvertieren am Ende kostenlos war (andernfalls
-
hätte es ein Leerzeichen sein müssen), und es wird ein Byte auf dem Weg gespart, indem~s.index(l)
statt verwendet wird-~s.index(l)
.Könnten 51 Bytes sein, wenn Python-Tupel dieselben
find
Funktionen haben wie Strings (-1 zurückgeben, wenn sie nicht gefunden werden, anstatt einen Fehler auszulösen), aber kein solches Glück ...quelle
s
für den rekursiven Aufruf?def func(f, *args): f(*args)
; das entpacken innerhalb von funktionsaufrufen ist py2 gültig. Was ist py3-nur innerhalb Liste / dict Comprehensions (dh Auspacken[1, 2, *s]
) oder Auspacken Variablen:a, *b = [1,2,3,4]
.R , 62 Bytes
Probieren Sie es online!
Erstellt die Liste in umgekehrter Reihenfolge.
match
Gibt den ersten Index vonF[1]
(den vorherigen Wert) inF[-1]
(den Rest der Liste) zurück und zurück,0
wenn keine Übereinstimmung gefunden wird.F
wird beim ersten Durchlauf der Schleife initialisiertFALSE
und gezwungen .0
while
quelle
match
dieses Problem ist, wenn Sie es so konstruieren. Wirklich sauber.F
,0
wannn==1
es sonst zurückkehren würdeFALSE
.Perl 6 ,
4742 Bytes-5 bytes dank nwellnhof
Probieren Sie es online!
Anonymer Codeblock, der das 0-indizierte Element in der Sequenz ausgibt.
Erläuterung:
quelle
Borowski-Shell, 102 Bytes
versuche es online
quelle
Stax ,
109 BytesFühren Sie es aus und debuggen Sie es
Wenn eine 0-basierte Indizierung zulässig ist:
Stax , 8 Bytes
Führen Sie es aus und debuggen Sie es
quelle
J ,
2923 BytesProbieren Sie es online!
Die eigentliche Arbeit wird im Iterationsverb des
^:
Potenzverbs geleistet , das so oft wie das Argument iteriert und[
die Iteration mit dem konstanten Wert 0 beginnt&0
...(#|1+}.i.{.)
Dies wird wiederholt. Brechen sie ab...}.i.{.
Finden Sie den Index desi.
Kopfes der Liste{.
innerhalb des Endes der Liste}.
. Dies gibt einen 0-basierten Index zurück. Wenn das aktuelle Element also 1 vorher gefunden wurde, wird 0 zurückgegeben. Wenn es nicht gefunden wird, wird die Länge der Liste zurückgegeben, dh die Länge des Endes.1+
Fügen Sie dem Wert eine hinzu, um die 0-basierte Indizierung zu korrigieren, da das "Wie weit zurück" des Ven Eck 1-basiert ist. Beachten Sie, dass der Wert nun der Länge der vollständigen Liste entspricht, wenn er nicht gefunden wurde.#|
Gibt den Rest des im vorherigen Schritt berechneten Werts zurück, dividiert durch die Länge der vollständigen Liste. Beachten Sie, dass dies "nicht gefunden" zu 0 macht, aber alle anderen Werte unverändert lässt.,~
Fügen Sie den neuen Wert an den Anfang der Liste an. Wir verwenden die Vorderseite eher als letztes, nur aus Bequemlichkeitsgründen.1{
Geben Sie das zweite Element in der Liste zurück, da wir es zu oft berechnet haben, da es auf diese Weise kürzer ist.quelle
Python , 51 Bytes
Probieren Sie es online!
Ausgänge
False
für0
. Implementiert die Spezifikation ziemlich wörtlich und sucht nach der niedrigsten positiven Ganzzahl,i
so dassf(n-1)==f(n-i-1)
. Wenn eine solche Suche zu führt,i>=n
ist das vorherige Element noch nicht erschienen und wir produzieren0
.Anstatt sinnvolle Maßnahmen wie das Speichern früherer Werte in einer Liste zu ergreifen, berechnet die Funktion diese nur rekursiv von Grund auf neu, wenn sie benötigt werden und manchmal, wenn sie nicht benötigt werden. Dadurch läuft die Funktion bei Eingängen über 10 sehr langsam.
quelle
APL (Dyalog Unicode) ,
1917 Byte SBCSVielen Dank an ngn, Adám, Richard Park und H.PWiz für ihre Hilfe beim Schreiben und Golfen dieser Antwort in The APL Orchard , einem großartigen Ort, um APL zu lernen und APL-Hilfe zu erhalten.
Edit: -2 Bytes von Adám.
Probieren Sie es online!
Erläuterung
quelle
Wolfram Language (Mathematica) , 48 Byte
Probieren Sie es online!
Werte ungleich Null werden als Singleton-Listen zurückgegeben .
quelle
05AB1E , 8 Bytes
Erläuterung:
quelle
F¯Rćk
? ;)Java,
968076 BytesNicht verschleiert:
quelle
int[]
in dieint
Deklaration einfügst und<1
stattdessen auch verwendest==0
. Beispiel:int f(int n){int l[]=new int[n],i=0,j,v=0;while(++i<n){j=l[v];l[v]=i;v=j<1?0:i-j;}return v;}
n->{int l[]=new int[n],i=0,j,v=0;for(;++i<n;l[v]=i,v=j<1?0:i-j)j=l[v];return v;}
Holzkohle , 23 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Setzen Sie den ersten Term auf 0.
Loop-
n-1
Zeiten. (Wenn die 0-Indizierung akzeptabel ist,⊖
kann sie für eine 1-Byte-Speicherung entfernt werden.)Der nächste Begriff ist der inkrementierte Index des aktuellen Begriffs in der umgekehrten Liste der vorherigen Begriffe.
Fügen Sie den aktuellen Begriff zur Liste der vorherigen Begriffe hinzu.
Setzen Sie den aktuellen Begriff auf den nächsten Begriff.
Gibt den aktuellen Term am Ende der Schleife aus.
quelle
Gelee , 7 Bytes
Probieren Sie es online!
0-indiziert.
quelle
Gelee , 8 Bytes
Probieren Sie es online!
Wie?
Beachten Sie, dass
Ḣ
wir ohne das Finale tatsächlich gesammelt haben[a(n), a(n-1), ..., a(2), a(1), n]
quelle
C (gcc) 63 Bytes
Probieren Sie es online!
0-indiziert.
quelle
Haskell ,
68 6766 BytesGanz unkomplizierte Implementierung (mit 0-basierter Indizierung).
Probieren Sie es online!
quelle
Haskell, 61 Bytes
0-basierte Indizierung.
Probieren Sie es online!
quelle
Japt
-h
, 11 BytesVersuch es
quelle
C # (Visual C # Interactive Compiler) , 77 Byte
Probieren Sie es online!
Ziemlich genau ein Port der Java-Antwort an dieser Stelle.
quelle
Python 3 ,
12811411110299 Bytes102 -> 99 Bytes, danke an Jonathan Frech
Probieren Sie es online!
quelle
-
stattdessen verwenden!=
, um ein Byte zu speichern.Perl 5 (
-p
), 42 BytesProbieren Sie es online!
quelle
Python 3 , 112 Bytes
Probieren Sie es online!
-3 Bytes dank mypetlion
quelle
for _ in a*int(input()):k=a[-1];a+=k in a[:-1]and[a[::-1].index(k)+~a[-2::-1].index(k)]or[0]
3 Bytes speichern.Rot ,
10695 BytesProbieren Sie es online!
quelle
CJam (15 Bytes)
Online-Demo . Dies ist ein vollständiges Programm und 0-indiziert.
Präparation
quelle
Clojure, 69 Bytes
Leider scheint ein funktionalerer Ansatz länger zu dauern.
quelle
DC,
949190 BytesDie Eingabe erfolgt während des Programms. Speichern Sie dies in eine Datei und führen Sie dann "dc" aus. Auf jeden Fall nicht die kürzeste, aber ich habe Spaß mit solchen Herausforderungen in DC. Die Eingabe erfolgt wie bevorzugt über einen 1-basierten Index.
quelle
C ++ (clang) ,
241235234219197189 Bytes197 -> 189 Bytes dank ceilingcat
Probieren Sie es online!
quelle
Pyth , 18 Bytes
Probieren Sie es online!
Baut die Sequenz in umgekehrter Reihenfolge auf und druckt das erste Element (letzter Term der Sequenz).
quelle