Stellen Sie sich einen "Draht" mit n
Leerzeichen vor. Stellen Sie sich weiter vor, dass sich in diesem Draht "Elektronen" befinden. Diese Elektronen leben nur eine Zeiteinheit. Alle Räume im Draht, die genau einem Elektron benachbart sind, werden zu einem Elektron. In der Game of Life-Terminologie ist dies B1/S
.
Dies ist beispielsweise ein Draht der Länge 10 mit der Periode 62.
Regeln
- Input,,
n
ist eine einzelne positive ganze Zahl. - Die Ausgabe muss eine einzelne Ganzzahl sein, die die Periode eines Drahtes der Länge n angibt.
- Der Ausgangszustand ist ein einzelnes Elektron an einem Ende des Drahtes.
- Der Zeitraum enthält nicht unbedingt den Ausgangszustand. Einige Längen kehren nie in den Ausgangszustand zurück, aber alle sind periodisch.
- Ein statischer Draht (dh einer ohne Elektronen) hat die Periode 1.
- Randbedingungen sind nicht periodisch. Das heißt, der Draht ist in keiner Weise toroidal.
Testfälle
Besonderer Dank geht an orlp für die Erstellung dieser Liste. (Ich habe es bis zu n = 27 überprüft.)
1 1
2 2
3 1
4 6
5 4
6 14
7 1
8 14
9 12
10 62
11 8
12 126
13 28
14 30
15 1
16 30
17 28
18 1022
19 24
20 126
21 124
22 4094
23 16
24 2046
25 252
26 1022
27 56
28 32766
29 60
30 62
31 1
32 62
33 60
34 8190
35 56
36 174762
37 2044
38 8190
39 48
40 2046
41 252
42 254
43 248
44 8190
45 8188
Sie können hier mit meinem Game-of-Life-ähnlichen Simulator Testfälle für n = 2 bis 21 sehen: Variationen des Lebens .
EDIT: die Sequenz hier wurde als A268754 veröffentlicht !
code-golf
cellular-automata
El'endia Starman
quelle
quelle
2^n-1
die Anzahl der möglichen Nicht-Null-Zustände des "Drahtes"The period does not necessarily include the starting state. Some lengths never return to the starting state, but all of them are periodic.
Hast du ein Beispiel?Antworten:
Python 2,
14814287 BytesVerwendet den Zykluserkennungsalgorithmus von Brent und läuft somit tatsächlich schnell.
Ich habe auch eine Animation in Python geschrieben (beide 2 & 3 Arbeit). Es muss
pyglet
rennen. Sie können die Animation anzeigen, indem Sie Folgendes ausführen:(Laden Sie den Inhalt herunter und überprüfen Sie den Code, bevor Sie ihn ausführen.) Sie können die Tasten + und - drücken, um das angezeigte n zu erhöhen / zu verringern .
Und für diejenigen, die diese Zahlenfolge weiter erforschen möchten, ist hier eine lesbare Version (diese wurde verwendet, um die obigen Testfälle zu generieren):
quelle
Mathematica, 127 Bytes
Erläuterung
Regel 18 :
Testfälle
quelle
Python 2, 68 Bytes
Die Zykluserkennung könnte besser sein, aber der iterative Schritt ist schön.
Indem das Array als Binärzahl dargestellt wird
k
, kann die Aktualisierung durchgeführt werden, indem das XORk
um eins nach links/2
und eins nach rechts verschoben und*2
dann aufn
Bytes wie abgeschnitten wird%2**n
.quelle
Python
32,134121118 BytesGrundsätzlich das Gleiche wie meine Pyth-Antwort , jedoch etwas angepasst, da bestimmte integrierte Funktionen in Python fehlen.
Ungolfed-Version:
quelle
Pyth,
3936 BytesVerwendet die Funktion "kumulativer Festpunkt", um bis kurz vor der Wiederholung einer Konfiguration zu iterieren, und gibt alle Zwischenkonfigurationen als Liste von Listen zurück. Dies funktioniert, weil die Regeln deterministisch sind und die Konfiguration der nächsten Generation eine Funktion der aktuellen Konfiguration ist. Dies bedeutet, dass die Automaten einen Zyklus abgeschlossen haben, sobald dieselbe Konfiguration wieder erscheint.
Nach Erreichen dieser (der letzten Iteration des Zyklus) ruft er die Funktion next-gen ein letztes Mal für das letzte Element der Liste "history" auf, um die nächste Konfiguration (die Startkonfiguration eines Zyklus) zu erhalten Finden Sie seinen Index in der Geschichte. Jetzt ist die Periode einfach die Länge (1 + Index des Zyklusendes) minus dem Index des Zyklusbeginns.
Im pythonischen Pseudocode:
Die Testsuite benötigt zu viel Zeit, um vom Server beendet zu werden. Daher müssen Sie das reguläre Programm verwenden und einzeln testen oder Pyth installieren (falls nicht) und mithilfe eines Skripts testen.
quelle
Jelly,
191817 BytesDieser Code berechnet die ersten 2 n Zustände, ist also nicht besonders schnell oder speichereffizient ...
Probieren Sie es online! oder überprüfen Sie die ersten 16 Testfälle .
Alternative Version, 13 Bytes (nicht konkurrierend)
Jelly-Versionen, die diese Herausforderung nachholen, verfügen über eine integrierte Schleifenerkennung, die eine kürzere und effizientere Lösung ermöglicht.
Dies erledigt den letzten Testfall mühelos. Probieren Sie es online!
Wie es funktioniert
Beachten Sie, dass die Hilfsverknüpfung in der ersten Iteration auf 2 n angewendet wird, wodurch kein gültiger Zustand codiert wird. Jedoch ((2 n ÷ 2) ^ (2 n × 2))% 2 n = (2 n - 1 + 2 n + 1 )% 2 n = 2 n - 1 , die eine der möglichen Ausgangszustände ist.
Da wir 2 n + 1- mal eine Schleife durchführen , ist garantiert, dass wir zweimal auf einen Zustand stoßen, was die Schleifenerkennung erfolgreich macht.
quelle
CJam,
4134312725 BytesVielen Dank an Dennis für das Speichern von 3 Bytes. Das Ausleihen einer Idee aus seiner Gelee-Antwort ersparte weitere 4.
Teste es hier.
Erläuterung
Ich stelle den Draht einfach als Ganzzahl dar (deren Bits die Positionen der Elektronen angeben), anstatt eine tatsächliche Bitliste zu verwenden. Der Status wird über relativ einfache bitweise Berechnungen aktualisiert.
Um den Zeitraum zu ermitteln, für den wir alle Zwischenergebnisse auf dem Stapel gesammelt haben, führen Sie die Simulation für 2 n-1 + 1- Schritte durch und bestimmen Sie dann den Zeitraum als Anzahl der Elemente seit dem letzten Auftreten des Endzustands (plus 1).
Hier ist eine Aufschlüsselung des Codes:
quelle
JavaScript (ES6) 99
104Prüfung
quelle
Haskell, 170 Bytes
x!p
Gibt das Element am Index p an, wenn es sich in Grenzen befindet. Andernfallsn
berechnet 0 den nächsten Schritt.g i
gibt deni
th Schritt.c x
gibt die Periode an, wenn mitx
.f
Wickelt alles zusammen.(Hinweis: Gepostet von einem Telefon mit dem Umarmungsinterpreter, der nicht über alle Funktionen verfügt und möglicherweise Tippfehler enthält.)
quelle
MATL ,
38373635 BytesHierbei wird eine Schleife verwendet, die neue Zustände berechnet, bis der neue Zustand einem der vorhergehenden entspricht. Jeder Zustand ist ein Vektor aus Nullen und Einsen. Diese Vektoren werden als Zeilen eines wachsenden 2D-Arrays gespeichert.
Die Berechnung jedes neuen Zustands erfolgt, indem der aktuelle Zustand mit der Sequenz verknüpft
[1,0,1]
wird, nur der zentrale Teil beibehalten und auf0
einen anderen Eintrag gesetzt wird1
.BEARBEITEN (13. Mai 2016) Der Code unter dem folgenden Link wurde in Übereinstimmung mit den Änderungen, die in der Sprache nach dem Verfassen dieser Antwort vorgenommen wurden, leicht geändert
Probieren Sie es online!
quelle
Perl 6, 81 Bytes
Erweitert und etwas ungolfed
Ein bisschen Erklärung:
[op]
reduziert die Liste mit op. Zum Beispiel[+] @list
wird summieren@list
R
ist eine Meta-Operation, die die Argumente einer Operation umkehrt. Zum Beispiel1 R- 3
ergibt 2.quelle
C ++, 211 Bytes
Golf gespielt
Mit zusätzlichen Leerzeichen für die Lesbarkeit
Gute Praxis für das Bitset von C ++; und eine großartige Aufklärung über den Zykluserkennungsalgorithmus von Brent (wie er von @orlp verwendet wird)
quelle
Pyth, 95 Bytes
Sie können es hier ausprobieren .
quelle
Pyth, 29 Bytes
Verwendet den Algorithmus
a(n+1) = ((a(n) << 1)^(a(n) >> 1)) % (2 ** N)
.quelle
Ruby, 72 Bytes
Anonyme Funktion.
quelle