programmieren-in-rust/aufgaben/sheet03/task1/README.md
2017-02-16 15:12:56 +01:00

3.7 KiB
Executable File

Aufgabe 3.1: Rule 90

Zelluläre Automaten simulieren ein System von Zellen mit diskreten Werten in diskreten Zeitschritten, wobei sich der Zustand des Systems zum Zeitpunkt n + 1 deterministisch aus dem Zustand zum Zeitpunkt n berechnen lässt. In den meisten Fällen hängt der Wert einer Zelle allein von seinem eigenen Wert und den Werten seiner Nachbarn zum vorherigen Zeitpunkt ab.

"Rule 90" ist ein eindimensionaler, zellulärer Automat, dessen Zellen boolesch sind, also nur zwei Werte annehmen können. Oft spricht man bei einer Zelle mit einer 0 von einer "toten Zelle", bei einer 1 von einer "lebenden" Zelle.

Diese Zellen können nun nach bestimmten Vorschriften in diskreten Zeitschritten simuliert werden. Der Wert einer Zelle zu dem Zeitschritt n + 1 hängt von seinem Wert und der Wert seiner beiden direkten Nachbarn zum Zeitpunkt n ab. Sind z.B. zum Zeitpunkt n alle drei Zellen tot, wird die mittlere der Zellen zum Zeitpunkt n + 1 ebenfalls tot bleiben.

Die vollständigen Regeln lauten wie folgt:

Vorheriger Zeitschritt 111 110 101 100 011 010 001 000
Neuer Wert für mittlere Zelle _0_ _1_ _0_ _1_ _1_ _0_ _1_ _0_

Nun kann man die diskreten Zeitschritte zeilenweise anzeigen. Das sieht dann z.B. so aus (in diesem Beispiel ist der Automat 5 Zellen groß):

0 1 1 0 0
1 1 1 1 0
1 0 0 1 0
0 1 1 0 0

Zu diesem Zeitpunkt sollte man sich fragen: Was ist mit den Randzellen? In dieser Aufgabe gehen wir davon aus, dass der Anfang und das Ende des Systems verbunden sind, d.h. der linke Nachbar der ersten Zelle ist die letzte Zelle und der rechte Nachbar der letzten Zelle ist die erste Zelle.


In dieser Aufgabe sollt ihr ein Programm schreiben, welches den Automaten "Rule 90" für Nutzereingaben simuliert. Diese Funktionalität soll in mehrere Funktionen aufgeteilt werden.

a) Eingabe einlesen

Zunächst muss vom Nutzer die initiale Konfiguration des Automaten eingelesen werden. Dafür soll eine Funktion read_input() geschrieben werden, die teilweise bereits von uns bereitgestellt wurde. In dem schon existierenden Code wird lediglich ein String vom Nutzer eingelesen, der nur '0' und '1' enthält. Eure Aufgabe ist es, aus diesem String einen Vec<bool> zu erstellen, der für jede '0' im String einen false-Eintrag und für jede '1' einen true-Eintrag enthält (in der richtigen Reihenfolge). Dieser Vektor soll dann von der Funktion zurückgegeben werden.

b) Zeitschritt simulieren

Nun sollt ihr eine Funktion next_step() schreiben, die aus der Konfiguration des Automaten zu einem Zeitpunkt den nächsten Zeitpunkt berechnen soll. Den Automaten zu einem Zeitpunkt stellen wir weiterhin einfach als ein Boolean-Array dar; es muss also kein neuer Typ erstellt werden.

c) Funktionen in main() benutzen

Nun müssen beide Funktionen noch genutzt werden. In der main() Funktion wird eine initiale Konfiguration des Automaten eingelesen, welcher dann über z.B. 20 Zeitschritte simuliert werden soll.

In jedem Zeitschritt soll der Zustand in einer Zeile auf dem Terminal ausgegeben werden. Die Ausgabe kann entweder in Form von 0en und 1en geschehen (wie oben im Beispiel) oder ihr könnt andere eindeutige Zeichen verwenden. Es würde sich z.B. anbieten, für tote Zellen zwei Leerzeichen und für lebende Zellen zwei U+2588 FULL BLOCK ('█') auszugeben:

  ████
████████
██    ██
  ████

Wenn alles klappt, probiert mal die initiale Konfiguration 0000000000000001000000000000000 aus!