Inspiriert von der vorherigen Frage .
Golombs selbstbeschreibende Sequenz g (n) ist eine Sequenz, bei der jede natürliche Zahl n
innerhalb der Sequenz g (n) mal wiederholt wird.
Die ersten Zahlen in der Sequenz sind:
n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
g(n) 1 2 2 3 3 4 4 4 5 5 5 6 6 6 6 7 7 7 7 8
Sie können sehen, dass g (4) = 3 ist und dass "4" dreimal in der Sequenz wiederholt wird.
Bei einer Eingabe von n
, Ausgabe g(n)
.
Einschränkungen: n <100000.
Der kleinste Code gewinnt.
n
eher als verwendet2 - n % 1
. Haben Sie Grund zu der Annahme, dass die Antworten erheblich voneinander abweichen?golomb=1:2:2:concat(zipWith replicate(drop 2 golomb)[3..])
Antworten:
GolfScript (31 Zeichen)
Demo
quelle
Gelee , nicht konkurrierend
10 Bytes Diese Antwort ist nicht konkurrierend, da die Herausforderung vor der Erstellung von Jelly liegt.
Dies verwendet die rekursive Formel a (1) = 1, a (n + 1) = 1 + a (n + 1 - a (a (n))) von der OEIS-Seite.
Probieren Sie es online aus!
Wie es funktioniert
quelle
PHP - 63 Zeichen
Schnell UND kurz.Ich habe anscheinend die falsche Reihenfolge im Sinn gehabt. Derp.
Dies ist RICHTIG, schnell und kurz.
Die Genauigkeit kann über die erforderliche Marke von 100.000 hinaus leiden, aber ich habe die Marke tatsächlich erreicht.
quelle
PHP
Diese rekursive Version ist kürzer (60), aber rechnerisch ineffizient:
Das geht viel schneller, aber länger (78):
Viel schneller, aber mit 89 Zeichen wäre:
Welches ist O (n)
quelle
Haskell,
3027 Zeichenquelle
Oase , 7 Bytes (nicht konkurrierend)
Code:
Probieren Sie es online aus!
Oasis ist eine von Adnan entworfene Sprache, die auf Sequenzen spezialisiert ist.
Derzeit kann diese Sprache Rekursion und geschlossene Form ausführen.
Das
T
am Ende ist eine Abkürzung für10
, was darauf hinweist, dassa(0) = 0
unda(1) = 1
. Um weitere Testfälle hinzuzufügen, fügen Sie diese einfach der Liste am Ende hinzu.Jetzt haben wir im Wesentlichen berechnet
a(n-a(a(n-1))+1
.quelle
Perl, 48 Zeichen
Eingabe auf stdin, Ausgabe auf stdout. Benötigt Perl 5.10+ und das
-M5.010
, um diesay
Funktion zu aktivieren . Dauert aufgrund ineffizienter Array-Manipulation etwa O ( n 2 ), ist aber immer noch schnell genug, um problemlos bis zum 100.000sten Term zu berechnen.quelle
Julia - 28
Auf rekursive Weise:
Ausgabe:
quelle
Python - 64 Zeichen
quelle
[i]*g[i-1]
würde, also beugte ich mich nach hinten, um es anders zu machen. Ich dachte, es würde sich aus irgendeinem Grund eher so verhalten, als würde man eine Matrix mit einem Skalar multiplizieren ...Javascript, 93 Zeichen
quelle
J, 43 Zeichen
Definiert eine Funktion unter Verwendung des asymptotischen Ausdrucks auf der Wikipedia-Seite.
Ärgerlicherweise werden 9 Zeichen verwendet, die nur auf die nächste Ganzzahl gerundet werden.
quelle
Vorspiel ,
695554 BytesWenn ein standardkonformer Interpreter verwendet wird, werden Eingabe und Ausgabe als Bytewerte verwendet . Um Dezimalzahlen in STDIN / STDOUT tatsächlich verwenden zu können, benötigen Sie den Python-Interpreter mit
NUMERIC_OUTPUT = True
und eine zusätzliche OptionNUMERIC_INPUT = True
.Erläuterung
Das Grundgerüst des Programms ist
Wir lesen die Eingabe
N
auf die erste Stimme und dekrementieren sie, um sie zu erhaltenN-1
. Wir initialisieren auch die zweite Stimme zu1
. Dann schleifen wirN-1
einmal, wobei jede Iteration den nächsten Wert der Sequenz auf dem zweiten Stapel erhält. Am Ende drucken wir dieN
th Nummer.Die Idee des Programms besteht darin, jedes Element der Sequenz in eine Warteschlange bei der dritten Stimme zu stellen und den Kopf dieser Warteschlange in jeder Iteration zu dekrementieren. Wenn der Kopf erreicht ist
0
, erhöhen wir den Wert der Sequenz und entfernen diesen0
.Das Problem ist nun, dass Prelude Stapel und keine Warteschlangen verwendet. Wir müssen diesen Stapel also ein wenig verschieben, um ihn wie eine Warteschlange zu verwenden.
Dies kopiert den aktuellen Wert der Sequenz in die erste Stimme (als temporäre Kopie) und drückt a
0
auf die zweite Stimme (um das Ende der Warteschlange zu markieren). Und führt dann eine Schleife aus, um den dritten Stapel auf den zweiten zu verschieben (und dadurch umzukehren). Nach der Schleife legen wir die Kopie des aktuellen Sequenzwerts auf den zweiten Stapel (der das Ende unserer Warteschlange darstellt).Das sieht ein bisschen hässlich aus, aber im Grunde ist es eine Schleife, die den Stack zurück auf die dritte Stimme verschiebt. Da sich das
)
in derselben Spalte wie die Schaltanweisungen befindet, wird das, was0
wir früher auf die zweite Stimme gesetzt haben, auch auf die dritte Stimme landen, sodass wir es mit einer anderen entfernen müssen#
. Verringern Sie dann die Spitze der 3. Stimme, dh den Kopf der Warteschlange.Jetzt wird es etwas nervig - wir wollen etwas Code ausführen, wenn dieser Wert ist
0
, aber die einzige Kontrollstruktur von Prelude (die Schleife) reagiert nur auf Werte ungleich Null.Beachten Sie, dass die Spitze der zweiten Stimme wahr ist (da die Golomb-Sequenz keine
0
s enthält). Die Arbeitslast geht also in diese Stimme (das letztere Klammerpaar). Wir müssen nur verhindern, dass dies geschieht, wenn der Leiter der Warteschlange noch0
nicht vorhanden ist. Also haben wir zuerst eine "Schleife" bei der dritten Stimme, die a0
auf die zweite Stimme drückt, wenn der Kopf der Warteschlange immer noch nicht Null ist. Wir setzen auch eine0
dritte Stimme ein, um die Schleife sofort zu verlassen. Die#
auf der dritten Stimme entfernt dann entweder das0
oder entfernt den Kopf der Warteschlange , wenn das bereits Null war. Jetzt wird diese zweite Schleife nur eingegeben, wenn der Kopf der Warteschlange Null war (und die0
auf die zweite Stimme wurde nie gedrückt). In diesem Fall erhöhen wir den aktuellen Wert der Sequenz und drücken a0
, um die Schleife zu verlassen. Schließlich wird es immer eine0
oben auf dem Stapel geben, die wir verwerfen müssen.Ich habe dir gesagt, dass logische Negation im Präludium nervt ...
quelle
Mathematica, 27 Bytes
Eine andere rekursive Lösung.
quelle
CJam, 14 Bytes
CJam ist viel jünger als diese Herausforderung, daher ist diese Antwort nicht für das grüne Häkchen geeignet. Es ist jedoch ziemlich selten, dass Sie
j
dies gut nutzen können, deshalb wollte ich es trotzdem posten.Testen Sie es hier.
Erläuterung
j
ist im Grunde der "gespeicherte Rekursionsoperator". Es braucht eine ganze ZahlN
, ein Array und einen BlockF
. Das Array wird zum Initialisieren der Memoisierung verwendet: Das Element am Indexi
wird für zurückgegebenF(i)
.j
Berechnet dannF(N)
entweder durchn
Nachschlagen oder durch Ausführen des Blocks (mit auf dem Stapel), wenn der Wert noch nicht gespeichert wurde. Die wirklich raffinierte Funktion ist, dass innerhalb des Blocksj
nur eine Ganzzahl verwendeti
wird undF(i)
rekursiv aufgerufen wird. Also hier ist der Code:quelle
J, 16 Bytes
Diese Lösung basiert stark auf der Lösung von algorithmshark für ein ähnliches Problem. Dort finden Sie eine Erklärung zu dieser Methode.
J, 33 Bytes
In diesem Ansatz baue ich eine Sequenz
h(k)
mit den Werten der ersten Indizes auf,i
wo dieg(i)=k
so sindh = 1 2 4 6 9 12 16...
. Wir könnenh(k)
ziemlich einfachh(1..k-1)
mit dem Ausdruck kommen,({:+1+[:+/#<:])
wo die Eingabe isth(1..k-1)
.Die Berechnung der Ausgabe von
h
ist unkompliziert.h ([:+/]>:[) input
quelle
Brachylog , 13 Bytes (nicht konkurrierend)
Probieren Sie es online aus!
Erläuterung
quelle
Python - 76 Zeichen
quelle
None
s. Scheint die "richtige" Menge vonNone
s tho zu sein :)None
Typ zurückgibt . Ich habe gerade die verschachtelten Listenverständnisse verwendet, um eine verschachtelte Schleife zu erreichen. Der einzige Zweck des Listenverständnisses hier ist, zu bewirken, dass der Code die richtige Anzahl von SchleifenJavaScript - 48 Zeichen
Erstellt ein 1-indiziertes Array
g
mit den Sequenzwerten.Bearbeiten - JavaScript - 46 Zeichen
Erstellt ein 1-indiziertes Array
v
mit den Sequenzwerten.Bearbeiten 2 - ECMAScript 6 - 27 Zeichen
Die ersten beiden sind ziemlich schnell - die dritte ist sehr langsam
quelle
Haskell, 63 Bytes
Dies ist der naive Ansatz, ich war mir der sehr kurzen Wiederholung nicht bewusst, als ich dies schrieb, aber ich dachte, ich würde es trotzdem posten, auch wenn es länger ist als alle anderen Haskell-Implementierungen, wie z
Berechnen Sie den n-ten Term von Golombs selbstbeschreibender Sequenz
und
/codegolf//a/23979/24877
quelle