Lets definieren eine Zeigersequenz, eine beliebige Sequenz sein , dass a (n) a ((n-1) - (a (n-1))) = forall n größer als eine endliche Zahl. Zum Beispiel, wenn unsere Sequenz mit begann
3 2 1
Unser nächster Term wäre 2
, weil a (n-1) = 1 , (n-1) -1 = 1 , a (1) = 2 (dieses Beispiel ist der Index Null, es ist jedoch egal, welchen Index Sie für die Berechnung verwenden immer gleich sein.). Wenn wir den Vorgang wiederholen, erhalten wir die unendliche Folge
3 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2
Aufgabe
Bei einem gegebenen Anfangsarray positiver Ganzzahlen wird die Zeigersequenz beginnend mit diesem Array ausgegeben.
Ausgabearten
Die Ausgabe soll flexibel sein, wenn Sie eine Funktion schreiben, die als Programm zurückgegeben werden kann, entweder eine unendliche Liste von Ganzzahlen oder eine Funktion, die die Sequenz indiziert. Wenn Sie ein vollständiges Programm schreiben, können Sie Terme der Sequenz auf unbestimmte Zeit ausgeben.
Sie können auch zwei Eingaben vornehmen, das Start-Array und einen Index. Wenn Sie sich dazu entscheiden, müssen Sie nur den Term der Sequenz an diesem Index ausgeben.
Sie erhalten niemals eine Sequenz, die vor dem Beginn der Sequenz indexiert werden muss. Beispielsweise 3
ist keine gültige Eingabe, da Sie Begriffe vor dem benötigen 3
, um den nächsten Begriff aufzulösen.
Dies ist Codegolf, daher ist Ihre Punktzahl die Anzahl der Bytes in Ihrem Programm, wobei eine niedrigere Punktzahl besser ist.
Testfälle
Testfälle werden der Einfachheit halber abgeschnitten
2 1 -> 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 ...
2 3 1 -> 2 3 1 3 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 ...
3 3 1 -> 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 ...
4 3 1 -> 4 3 1 3 4 4 3 3 4 4 4 3 4 4 4 4 3 4 4 4 4 3 4 4 4 4 3 4 ...
Antworten:
JavaScript (ES6), 25 Byte
Eine anonyme Funktion, die beim Aufrufen eine Funktion erstellt
f
, die das Element an einem bestimmten Index in der Sequenz angibt.Bitte lassen Sie mich wissen, wenn ich etwas falsch verstanden habe ...
quelle
f(n)
von innen anf(n)
. Ich glaube nicht, dass das jemals enden wird, aber ich kenne JS nicht.n
dera[n]
Wert niedrig genug ist, wird ein wahrer Wert zurückgegeben. Dadurch wird der Wert||
kurzgeschlossen und es wird verhindert, dass er unendlich oft wiederkehrt.n
es wird nicht bei jedem Anruf niedriger. Ich bin mir ziemlich sicher, wennn
größer als die Länge vona
dir ist, wird das nie aufhören.--n
ordnen Sien
zu,n-1
damit der nächste Verweis darauf auf den dekrementierten verweistn
.--n
dekrementiertn
, was bedeutet, dass diesf(--n-f(n))
dasselbe ist wief((n-1)-f(n-1))
Schale ,
76 BytesGibt eine unendliche Liste zurück. Probieren Sie es online! Beachten Sie, dass es eine Weile dauert, bis TIO das Ergebnis abschneidet und druckt.
Erläuterung
Der Operator
¡
hat mehrere Bedeutungen. Hier verwende ich "Konstruiere unendliche Liste durch Iteration einer Funktion, die ein neues Element aus der Liste der vorhandenen berechnet". Bei einer Liste mit der Länge N hat das neue Element einen auf 1 basierenden Index N + 1 . Alles, was wir tun müssen, ist das letzte Element der Liste zu negieren (dies ist der vorherige Wert) und anhand des Ergebnisses in die Liste zu indexieren.quelle
Haskell , 36 Bytes
Nimmt eine Liste auf und gibt eine Funktion zurück, die die Sequenz indiziert
Probieren Sie es online!
Erläuterung
Hier definieren wir eine Funktion
!
, die eine Listel
und einen Index annimmtn
. Wennn
weniger als die Länge istl
wir Indexl
durchn
, sonst geht es zurückl!((n-1)-l!(n-1))
. Dies folgt der rekursiven Definition der Funktion, die ich in der Frage angegeben habe.Hier ist das gleiche Programm ungolfed.
Ich verwende
e<-n-1
stattdessen, um Bytes beim Zuweisen zu speichernn-1
,e
damit es später verwendet werden kann.quelle
MATL ,
139 BytesGibt die Anfangsausdrücke gefolgt von n zusätzlichen Ausdrücken aus ( gemäß der Abfrage zulässig), wobei n eine positive Ganzzahl ist, die als Eingabe verwendet wird.
Probieren Sie es online!
Erläuterung
quelle
Mathematica, 63 Bytes
Nimmt zwei Eingänge
Probieren Sie es online!
-3 Bytes von Martin Ender
quelle
R , 55 Bytes
Probieren Sie es online!
Nimmt zwei Eingänge.
quelle
Standard-ML (MLton) , 58 Bytes
Probieren Sie es online! Die Funktion
a
nimmt die Anfangsliste und einen Index und gibt das Sequenzelement an diesem Index zurück. Anwendungsbeispiel:a [4,3,1] 5
Erträge4
.quelle
Gelee , 6 Bytes
Nimmt eine Sequenz S und eine ganze Zahl k und fügt k Terme zu S hinzu .
Probieren Sie es online!
Wie es funktioniert
quelle
Python 2 , 48 Bytes
Probieren Sie es online!
quelle
CJam, 10 Bytes
Für CJam ist das sehr gut (es schlägt sogar 05ab1e!).
Dies ist ein anonymer Block, der Eingaben in das Formular
i n
auf dem Stapel erwartet. Dabeii
handelt es sich um den Index in der Sequenz undn
um ein Array von Startnummern.Der Grund, warum dies so gut funktioniert, ist der
j
Operator, der eine gespeicherte Rekursion aus einer Reihe von Startwerten bereitstellt.Erläuterung:
quelle
Java (8), 60 Bytes
Nimmt zwei Eingaben (Integer-Array
a
und Integern
) und gibt denn
'ten Wert der Sequenz aus.Erläuterung:
Probieren Sie es hier aus. (Könnte einige Sekunden dauern.)
quelle
Perl, 38 +3 (-anl) Bytes
Probieren Sie es online
quelle
05AB1E , 20 Bytes
Erwartet die Eingabe als durch Leerzeichen getrennte Zeichenfolge und gibt sie auf unbestimmte Zeit aus. ziemlich einfache Implementierung
Beispiellauf:
quelle
Java (OpenJDK 8) ,
95939190 BytesProbieren Sie es online!
quelle
b[(j-1)-...]
gleichbedeutend mitb[~-j-...]
?j>=a.length
umj<a.length
ein Byte zu speichern:j<a.length?a[j]:b[~-j-b[j-1]]
. Ich bin auch neugierig: Warum hast du dich für einen Loop-Ansatz entschieden, wenn der rekursive Ansatz , der auch in der Challenge-Beschreibung selbst erklärt wird, nur 60 Bytes beträgt?Perl 5 ,
-a
30 BytesProbieren Sie es online!
quelle