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
quelle
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 Zeiler[x-1]&r[x] else
:)MATLAB,
146,143138(Funktioniert auch mit Octave Online, aber Sie müssen sich anmelden, um die Funktion in einer Datei zu speichern.)
Die Funktion nimmt eine Eingabe
n
undL
und gibt ein Array zurücko
das die Ausgabe enthält.Bei den Eingabewerten
n
handelt es sich um einen Skalar undL
einen Spaltenvektor, der im Format angegeben werden kann[;;;]
. Nicht ganz das, was du zeigst, aber du sagst, es ist innerhalb der Vernunft flexibel und das scheint so.Die Ausgabe ist als
n x n
Array mit 0en und 1en formatiert .Und eine Erklärung:
Update: Ich habe es geschafft, die if-else-Anweisung zu optimieren, um ein paar Bytes zu sparen. Das Eingabeformat wurde wieder in den Spaltenvektor geändert.
quelle
Haskell,
153149 Bytes%
gibt eine Liste von Bitlisten zurück. Anwendungsbeispiel:Ach je! Das Tragen der zufälligen Liste
L
ist Schmerz pur. Mal sehen, ob das kürzer sein kann.quelle
152 Bytes
Hier gibt es nichts Besonderes. Die Funktion gibt ein 2D-Array zurück, wobei der erste Rang die Zeile und der zweite die Spalte ist.
Eingezogene und neue Zeilen für Klarheit:
quelle
TI-BASIC,
10694878687 BytesTI-BASIC hat keinen Inkrementoperator, oder? Nun, das tut es irgendwie. Die
u
normalerweise bei Sequenzen verwendete Gleichungsvariable hat eine undurchsichtige Eigenschaft: Wennu
sie mit einem Argument aufgerufen wird, die Variable𝑛
auf eins größer als dieses Argument gesetzt. Das bedingte Inkrement hängt davon ab. (Ich habe lange darauf gewartet, es zu benutzen.)Damit die Listenindizierung ordnungsgemäß funktioniert,
𝑛
muss der Standardwert 0 und𝑛Min
der Standardwert 1 sein. Löschen Sie daher entweder den Arbeitsspeicher Ihres Rechners oder legen Sie diese Werte manuell fest, bevor Sie dies ausführen.augment({0},Ans)+augment(Ans,{0
Berechnet eine Liste von Summen zweier benachbarter Elemente, sodass eine Liste von 0s, 1s und 2s zurückgegeben wird. Dann ist die Magie in dieser Zeile:Das Ergebnis dieser Zeile ist, dass Listenelemente 0 sind, wenn sie 0 waren oder wenn sie 2 waren und das gelesene Bit 0 war.
Testfall:
quelle