Vorspiel , 69 55 54 Bytes
?1-(v #1)-
1 0v ^(# 0 (1+0)#)!
(#) ^#1-(0)#
Wenn 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 Option NUMERIC_INPUT = True
.
Erläuterung
Das Grundgerüst des Programms ist
?1-( 1 -
1 )!
Wir lesen die Eingabe N
auf die erste Stimme und dekrementieren sie, um sie zu erhalten N-1
. Wir initialisieren auch die zweite Stimme zu 1
. Dann schleifen wir N-1
einmal, wobei jede Iteration den nächsten Wert der Sequenz auf dem zweiten Stapel erhält. Am Ende drucken wir die N
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 diesen 0
.
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.
v #
0v ^
(#)
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).
)
(#
^#1-
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, was 0
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.
0 (1+0)#
(0)#
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 noch 0
nicht vorhanden ist. Also haben wir zuerst eine "Schleife" bei der dritten Stimme, die a 0
auf die zweite Stimme drückt, wenn der Kopf der Warteschlange immer noch nicht Null ist. Wir setzen auch eine 0
dritte Stimme ein, um die Schleife sofort zu verlassen. Die #
auf der dritten Stimme entfernt dann entweder das 0
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 a 0
, um die Schleife zu verlassen. Schließlich wird es immer eine 0
oben auf dem Stapel geben, die wir verwerfen müssen.
Ich habe dir gesagt, dass logische Negation im Präludium nervt ...
n
eher als verwendet2 - n % 1
. Haben Sie Grund zu der Annahme, dass die Antworten erheblich voneinander abweichen?