Die Sylvester-Sequenz OEIS A000058 ist eine Ganzzahlsequenz, die wie folgt definiert ist:
Jedes Mitglied ist das Produkt aller vorherigen Mitglieder plus eins. Das erste Mitglied der Sequenz ist 2.
Aufgabe
Erstellen Sie das kleinstmögliche Programm, das ein n benötigt und den n-ten Term von Sylvester's Sequence berechnet. Es gelten Standardeingaben, -ausgaben und -lücken. Da das Ergebnis sehr schnell wächst, ist nicht zu erwarten, dass ein Begriff verwendet wird, dessen Ergebnis in der von Ihnen gewählten Sprache einen Überlauf verursachen würde.
Testfälle
Sie können entweder keine oder eine Indizierung verwenden. (Hier verwende ich die Nullindizierung)
>>0
2
>>1
3
>>2
7
>>3
43
>>4
1807
n
dienth
Nummer der akzeptierten Sequenz zurück?Antworten:
Brain-Flak ,
7668585246 BytesProbieren Sie es online!
Verwendet stattdessen diese Beziehung:
welches von dieser Beziehung abgeleitet ist, modifiziert von der, die in der Sequenz angegeben ist:
a(n+1) = a(n) * (a(n) - 1) + 1
.Erläuterung
Eine Dokumentation der einzelnen Befehle finden Sie auf der GitHub-Seite .
Es gibt zwei Stapel in Brain-Flak, die ich als Stapel 1 bzw. Stapel 2 bezeichnen werde.
Die Eingabe wird in Stapel 1 gespeichert.
Für den Generierungsalgorithmus:
Alternative 46-Byte-Version
Dies verwendet nur einen Stapel.
Probieren Sie es online!
quelle
Gelee , 5 Bytes
Dies verwendet eine 0-basierte Indizierung und die Definition aus der Herausforderungsspezifikation.
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Hexagony , 27 Bytes
Entfaltet:
Probieren Sie es online!
Erläuterung
Betrachten wir die Reihenfolge
b(a) = a(n) - 1
und ordnen sie ein wenig um:Diese Sequenz ist sehr ähnlich, aber wir können das Inkrement bis zum Ende verschieben, wodurch ein Byte in diesem Programm gespeichert wird.
Also hier ist der kommentierte Quellcode:
Erstellt mit Timwis HexagonyColorer .
Und hier ist ein Speicherdiagramm (das rote Dreieck zeigt die ursprüngliche Position und Ausrichtung des Speicherzeigers):
Erstellt mit Timwis EsotericIDE .
Der Code beginnt auf dem grauen Pfad, der die linke Ecke einhüllt, sodass das anfängliche lineare Bit wie folgt lautet:
Dann trifft der Code die
<
Verzweigung und zeigt den Anfang (und das Ende) der Hauptschleife an. Solange die N- Flanke einen positiven Wert hat, wird der grüne Pfad ausgeführt. Dieser Pfad wird ein paar Mal um das Raster gewickelt, ist aber eigentlich völlig linear:Das
.
sind No-Ops, der eigentliche Code lautet also:Sobald diese Dekrementierung auf reduziert ist
N
,0
wird der rote Pfad ausgeführt:quelle
J,
181412 BytesDiese Version dank Randomra. Ich werde später versuchen, eine detaillierte Erklärung zu schreiben.
J, 14 Bytes
Diese Version dank Meilen. Verwendete das Power-Adverb
^:
anstelle der folgenden Agenda. Weitere Erklärungen folgen.J, 18 Bytes
0-indiziert.
Beispiele
Erläuterung
Dies ist eine Agenda, die so aussieht:
(Generiert mit
(9!:7)'┌┬┐├┼┤└┴┘│─'
then5!:4<'e'
)Zerlegen:
Mit dem oberen Zweig als Gerundium
G
und dem unteren als SelektorF
ist dies:Dies nutzt die konstante Funktion ,
2:
wenn0 = * n
, das heißt, wenn die Vorzeichen Null ist (alson
Null ist ). Ansonsten verwenden wir diese Gabel:Welches ist eins plus die folgenden auf Serie:
Bei weiterer Zerlegung ist dies product (
*/
) über self-reference ($:
) über range (i.
).quelle
2(]*:-<:)^:[~]
mit der Formela(0) = 2
und 14 Bytes zu erhaltena(n+1) = a(n)^2 - (a(n) - 1)
. Um größere Werte zu berechnen, muss der2
am Anfang als erweiterte Ganzzahl markiert werden.v`$:@.u
rekursive Format nicht bekannt. Ich habe immer ein^:v
Format verwendet, das oft komplexer ist. @miles Ich habe den(]v)
Trick auch nie benutzt . Ich habe gute 5 Minuten gebraucht, um es zu verstehen.2(]*:-<:)~&0~]
(oder2:0&(]*:-<:)~]
). Und sie 13 Bytes kombinieren]0&(]*:-<:)2:
.0&(]*:-<:)2:
. (Entschuldigung, ich sollte in den Kommentaren nicht Golf spielen .)Perl 6 , 24 Bytes
Erläuterung
Verwendung:
quelle
$_
? Was für eine Hexerei ist das?Haskell, 26 Bytes
Anwendungsbeispiel:
f 4
->1807
.quelle
Java 7,
4642 BytesVerwendet die 0-Indizierung mit der üblichen Formel. Ich tauschte
n*n-n
fürn*(n-1)
obwohl, da Java keine handliche Strombetreiber haben, und dief()
Anrufe wurden immer lang.quelle
f(n)*~-f(n)
sollte arbeiten.return--n<0
spart ein weiteres Byte.Haskell, 25 Bytes
quelle
SILOS , 60 Bytes
Probieren Sie es online!
Port of meine Antwort in C .
quelle
Brain-Flak ,
158154 BytesUndichte Nonne hat mich hier geschlagen
Probieren Sie es online!
Erläuterung
Setze eine Zwei unter die Eingabe a (0)
Wenn die Eingabe größer als Null ist, subtrahieren Sie Eins von der Eingabe und ...
Schweigend...
Legen Sie einen auf den anderen Stapel, um als Katalysator für die Multiplikation <> (()) <> zu wirken
Während der Stapel nicht leer ist
Bewegen Sie den oberen Rand der Liste und kopieren Sie
Den Katalysator mit der Kopie multiplizieren
Füge eins hinzu
Verschieben Sie die Sequenz zurück zum richtigen Stapel
Entfernen Sie alle Elemente außer dem untersten Element (dh der zuletzt erstellten Nummer).
quelle
C 32 Bytes
Verwendet 1-basierte Indizierung. Teste es auf Ideone .
quelle
Eigentlich 9 Bytes
Probieren Sie es online!
Verwendet stattdessen diese Beziehung:
welches von dieser Beziehung abgeleitet ist, modifiziert von der, die in der Sequenz angegeben ist:
a(n+1) = a(n) * (a(n) - 1) + 1
.quelle
R,
44 4241 Bytes2 Bytes sparen dank JDL
1 Byte sparen dank user5957401
quelle
n
garantiert nicht negativ ist, kann die Bedingung vonn>0
auf nur reduziert werdenn
.f(n-1)
ist 6 Bytes. Ich denke, dass Sie ein Byte speichern, indem Sie es etwas zuweisen. ieifelse(n,(a=f(n-1))^2-a+1,2)
Oasis , 4 Bytes (nicht konkurrierend)
Wahrscheinlich meine letzte Sprache aus der Golffamilie! Nicht konkurrierend, da die Sprache die Herausforderung datiert.
Code:
Alternative Lösung dank Zwei :
Erweiterte Version:
Erläuterung:
Verwendet die CP-1252- Codierung. Probieren Sie es online!
quelle
b<*>2
benutzte icha(n-1)*(a(n-1)+1)-1
b
da es automatisch ausgefüllt wird (und nicht die Eingabe) :).Python,
3836 Bytes2 Bytes dank Dennis.
Ideone es!
Verwendet stattdessen diese Beziehung, die von der in der Sequenz angegebenen abgewandelt wurde:
a(n+1) = a(n) * (a(n) - 1) + 1
Erläuterung
0**n*2
Gibt2
wannn=0
und0
andernfalls zurück, da0**0
dies1
in Python definiert ist.quelle
Cheddar , 26 Bytes
Probieren Sie es online!
Ziemlich idiomatisch.
Erläuterung
quelle
CJam, 10 Bytes
Verwendet eine 0-basierte Indizierung. Probieren Sie es online!
quelle
05AB1E , 7 Bytes
Erklärt
Verwendet nullbasierte Indizierung.
Probieren Sie es online!
quelle
Prolog, 49 Bytes
quelle
SILOS 201 Bytes
Probieren Sie es einfach online aus!
quelle
Gelee , 7 Bytes
Probieren Sie es online!
Verwendet stattdessen die in der Sequenz angegebene Beziehung:
a(n+1) = a(n)^2 - a(n) + 1
Erläuterung
quelle
C 46 Bytes
Ideone es!
Verwendet
p
als vorübergehende Lagerung des Produkts.Grundsätzlich habe ich zwei Sequenzen definiert
p(n)
undr(n)
, wor(n)=p(n-1)+1
undp(n)=p(n-1)*r(n)
.r(n)
ist die erforderliche Reihenfolge.quelle
R
50 4644 BytesAnstatt die gesamte Sequenz zu verfolgen, verfolgen wir nur das Produkt, das der angegebenen quadratischen Aktualisierungsregel folgt, solange
n> 1n> 0 ist. (Diese Sequenz verwendet die Konvention "Start beieinerNull".)Durch die Verwendung der Null-Start-Konvention werden einige Bytes gespart, da wir if (n) anstelle von if (n> 1) verwenden können.
quelle
Qualle , 13 Bytes
Probieren Sie es online!
Erläuterung
Beginnen wir von unten nach oben:
Dies ist ein Hook, der eine Funktion definiert
f(x) = (x-1)*x
.Dies setzt den vorherigen Hook mit der Inkrementierungsfunktion zusammen, sodass wir eine Funktion erhalten
g(x) = (x-1)*x+1
.Schließlich wird eine Funktion generiert,
h
die eine Iteration der vorherigen Funktion istg
, und zwar so oft, wie dies durch die Ganzzahleingabe gegeben ist.Und schließlich wenden wir diese Iteration auf den Anfangswert an
2
. Dasp
an der Spitze druckt nur das Ergebnis.Alternative (auch 13 Bytes)
Dies verschiebt das Inkrement bis zum Ende.
quelle
C,
43,34, 33 Bytes1-indiziert:
Testleitung:
quelle
Brachylog , 13 Bytes
Probieren Sie es online!
Verwendet stattdessen diese Beziehung:
welches von dieser Beziehung abgeleitet ist, modifiziert von der, die in der Sequenz angegeben ist:
a(n+1) = a(n) * (a(n) - 1) + 1
.quelle
Mathematica, 19 Bytes
Oder 21 Bytes:
quelle
Array
Lösung ist magisch. Schade,##0
ist keine Sache. ;)Labyrinth , 18 Bytes
Dank an Sp3000, die unabhängig voneinander die gleiche Lösung gefunden haben.
Probieren Sie es online!
quelle
Eigentlich ,
1412 BytesDies verwendete eine 0-Indizierung. Golfvorschläge sind willkommen. Probieren Sie es online!
Ungolfing:
quelle
GolfScript ,
1210 Bytes2 Bytes dank Dennis.
Probieren Sie es online!
Verwendet
a(n) = a(n-1) * (a(n-1)-1) + 1
.quelle
(
ist die Abkürzung für1-
;)
ist eine Abkürzung für1+
.