Einführung
In dieser Aufgabe simulieren wir einen bestimmten probabilistischen zellulären Automaten mit sehr schlechten Pseudozufallszahlen. Der zellulare Automat wird in binären Zeichenfolgen durch die folgende lokale Regel definiert. Angenommen, der linke Nachbar einer Zelle und die Zelle selbst haben die Zustände a
und b
.
- Wenn
min(a,b) == 0
, dann wird der neue Zustandb
heißtmax(a,b)
. - Wenn ja
min(a,b) == 1
, dann wird der neue Zustandb
zufällig aus ausgewählt{0,1}
.
Das folgende Bild zeigt eine mögliche 10-stufige Entwicklung eines einzelnen 1
.
1
11
101
1111
11001
101011
1111111
10001001
110011011
1010111101
Man beachte, wie sich zwei benachbarte 1
s manchmal zu 1
und manchmal zu 0
entwickeln und die am weitesten am Rand liegenden Bits immer 1
s sind. Ihre Aufgabe ist es, einen zellulären Automaten dieser Form zu entwickeln.
Eingänge
Ihre Eingaben sind eine positive Ganzzahl n
, die die Anzahl der anzuzeigenden Zeilen angibt, und eine nicht leere Liste von Bits L
, die wir als Zufallsquelle verwenden.
Ausgabe
Ihre Ausgabe ist eine Liste von Listen oder ein 2D-Array von Bits, die die Entwicklung eines einzelnen Elements 1
für n
Zeitschritte wie in der obigen Abbildung darstellen. Sie können die Ausgabe mit 0
s auffüllen, um Zeilen gleicher Länge zu erhalten. Es dürfen jedoch keine führenden 0
s vorhanden sein.
Die zufälligen Auswahlen im zellularen Automaten müssen aus der Liste gezogen werden L
und an den Anfang zurückspringen, wenn sie erschöpft sind. Genauer gesagt, wenn die Ausgabe zeilenweise von oben nach unten und von links nach rechts durchlaufen wird, bilden die aufeinanderfolgenden Zufallsauswahlen die Liste, die L
so oft wie nötig wiederholt wird.
Beispiel
Angenommen, die Eingaben sind n = 7
und L = [0,1,0]
. Dann entwickelt sich der zellulare Automat wie folgt in den 7 Schritten, in denen wir v
über jede zufällige Auswahl ein Rechts setzen :
[1]
[1,1]
v
[1,0,1]
[1,1,1,1]
v v v
[1,1,0,0,1]
v
[1,1,1,0,1,1]
v v v
[1,0,0,1,1,1,1]
Wenn wir alle mit einem gekennzeichneten Bits lesen v
, erhalten wir 01001001
, was L
2,66-mal wiederholt wird. Das nächste zufällige Bit wäre 0
.
Regeln und Wertung
Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig. Das genaue Format der Ein- und Ausgänge ist (aus vernünftigen Gründen) unwichtig.
Testfälle
Deterministische Version, jedes zufällige Bit ist 0
:
Inputs: 10 [0]
Output:
1
11
101
1111
10001
110011
1010101
11111111
100000001
1100000011
Jeder Zufallsbit ist 1
:
Inputs: 6 [1,1]
Output:
1
11
111
1111
11111
111111
Pseudozufällige Versionen:
Inputs: 10 [0,0,1]
Output:
1
11
101
1111
10101
111111
1010011
11110101
101011111
1111101001
Inputs: 10 [1,0,0,1]
Output:
1
11
111
1001
11011
111111
1001101
11010111
111111101
1011001111
Inputs: 15 [1,1,1,0,0,0]
Output:
1
11
111
1111
10001
110011
1110111
11011001
111111011
1100011111
11100100011
111101100101
1001111101111
11011000111111
101101001011101
min(a,b)
mita+b>1
undmax(a,b)
mit ersetzena+b
? Mir ist klar, dass Sie wahrscheinlich etwas tun müssen, um den allerersten Fall von1
-> zu behandeln11
(ich denke, Sie könnten es tunL=[1]+f()...
oder einen Weg finden, 1 in die Vorderseite von einzufügen,L
da dies immer 1 für die zweite Zeile