Das Verkehrsmodell von Biham-Middleton-Levine ist ein selbstorganisierender Zellularautomat, der den vereinfachten Verkehr modelliert.
Es besteht aus einer Anzahl von Autos, die durch Punkte auf einem Gitter mit einer zufälligen Startposition dargestellt werden, wobei jedes Auto einer von zwei Typen sein kann: diejenigen, die sich nur nach unten bewegen (in diesem Artikel als blau dargestellt), und diejenigen, die sich nur in Richtung bewegen rechts (in diesem Artikel rot dargestellt). Die beiden Wagentypen bewegen sich abwechselnd. In jeder Runde rücken alle Autos des entsprechenden Typs um einen Schritt vor, wenn sie nicht von einem anderen Auto geblockt werden.
Ihre Aufgabe ist es, dieses Modell als Animation zu visualisieren. Hier sind einige gute Demonstrationen.
Eingang
Eine Gleitkommazahl zwischen 0 und 1 für die Dichte und zwei Ganzzahlen für die Höhe und Breite des angezeigten Rasters. Angenommen, Eingaben sind gültig, und Parameter für eine Funktion oder das Lesen von Benutzereingaben sind in Ordnung.
Beispiel: 0.38 144 89
(entspricht obigem Bild)
Ausgabe
Ein Raster von mindestens 80 x 80, in dem die Animation dieses Modells angezeigt wird. Zu Beginn werden Autos nach dem Zufallsprinzip in das Raster eingefügt, bis das Raster die Eingabedichte mit der Hälfte Rot und der Hälfte Blau erreicht (dh Dichte multipliziert mit der Gesamtzahl der Rasterquadrate, gerundet, wie Sie möchten). Die Dichte muss dieser Wert sein, was bedeutet, dass Sie nicht jede Zelle mit einer Dichte als Wahrscheinlichkeit füllen können. Für jeden Schritt bewegt sich ein Wagentyp entweder nach unten oder nach rechts und umgibt ihn, wenn er die Kante passiert. Die Art des sich bewegenden Autos wechselt bei jedem Schritt. Um die Animation sichtbar zu machen, müssen zwischen jedem Schritt mindestens 10 ms liegen.
Regeln
Die Fahrzeuge können eine beliebige Farbe oder ein beliebiges Symbol haben, sofern sie voneinander und vom Hintergrund unterscheidbar sind und jeder Fahrzeugtyp dieselbe Farbe oder dasselbe Symbol aufweist.
Konsolen- und Grafikausgabe sind zulässig. Für die Konsolenausgabe ist jedes druckbare Symbol in Ordnung, die Ausgabe muss jedoch als Zeichenraster erfolgen.
Bitte geben Sie an, welche Art von Ausgabe Sie erstellt haben, wenn Sie keinen Screenshot oder kein GIF haben.
Die Simulation muss für immer laufen.
Die Ausgabe ist etwas komplex. Wenn Sie Fragen haben, kommentieren Sie diese bitte.
Antworten:
R
350338293291273268264 BytesUngolfed:
Funktion, die 3 Argumente akzeptiert:
d
als Dichte und Dimensionenx,y
.q
ist die Anzahl der Autos in jeder Farbe.m
ist die Matrix mit Autos, die anfänglich gefüllt wird, indem eine zufällige Art der Anzahl von Autos und leeren Räumen genommen wird. Autos sind entweder1
oder-1
, Leerraum ist0
.f
ist eine Funktion, die die Autos um eine Reihe bewegt und die Autos mit der Codierung1
. Es prüft, ob sich das Auto bewegen kann, indem es auf1
s überprüft, gefolgt von0
. Wirapply
rennenf
in jeder Reihe oder Spalte, je nachdem welches Auto.f
kümmert sich um die Bewegung der1
Autos, um die zu bewegen-1
Autos , transponieren wir die Matrix, ändern die Bewegungsrichtung, multiplizieren die Matrix mit-1
, so dass die-1
Autos zu1
Autos werden, und vv und die resultierende Matrix werden erneut transformiert.Hiermit wird
image
das Diagramm erstellt, wobei drei Standardfarben für die drei Werte verwendet werden. Verwendet dasanimation
Paket, um die Animationen mit den Standardoptionen (1 fps) zu verarbeiten.0.38, 144, 89:
0.2, 144, 89:
0.53, 144, 89:
quelle
0.38 144 89
aus dem Beispiel sein.Mathematica,
237228203198181 BytesDie Ausgabe ist dynamisch
Image
. Der Hintergrund ist hellgrün und die Autos sind je nach Fahrtrichtung schwarz oder magenta.Erläuterung
Erstelle das erste Board:
Stellen Sie
i
auf2
. Erstellen Sie einList
von{0, 2}
, dessen Länge der Boden ist (Dichte * Breite * Höhe / 2) (geteilt durch zwei, weil{0, 2}
Länge-2 ist).Formen Sie die resultierende 2D
List
(2 x etwas) in 1-DList
(Länge = Breite * Höhe). Pad,1
wenn nicht genügend Werte vorhanden sind.Sortieren Sie das Ergebnis (pseudo-) zufällig.
Partition, die in Länge (Breite) resultiert.
Bewahren Sie das in
b
.Erstellen Sie ein
Dynamic
Image
:Kippen Sie das Zeichen von
i
.Wenden Sie den Zellularautomaten mit Regel-
193973693
und Nachbargewichten{{0, 0, 0}, {3, 9, 1}, {0, 0, 0}}
aufb
transponiert an. Setze dasb
gleich.Wenn
i
es positiv ist, lassen Sie es inb
Ruhe. Wenn nicht, transponiere dasb
(2-
ist da, weil ich dasCellularAutomaton
ein bisschen golfen habe ). Dies transponiertb
im Wesentlichen jede zweite Iteration (um die Transposition rückgängig zu machen).Wandle das Array in ein buntes um
Image
.Mache den Ausdruck
Dynamic
. dh die obigen Funktionen werden wiederholt ausgeführt.Ausgabe
Hier ist eine Beispielausgabe (Eingaben:)
0.35, 192, 108
für 2000 Bilder (2x vergrößert).https://i.imgur.com/zmSyRut.mp4
quelle
Dyalog APL ,
190108115112 BytesLösung
TryAPL online (geringfügig geändert aufgrund von Online-Einschränkungen):
Setze
⎕IO←0
, definiere die Funktion S und definiere und zeige dann ein zufälliges 38% 14 × 29-Gitter G an .Mach eine Bewegung nach unten.
Machen Sie eine Bewegung nach rechts.
Weiter zu Schritt 2.
Animation des vorherigen Algorithmus, der die Dichte nicht garantierte.
Erläuterung
S←{
Definieren Sie die direkte Funktion S (hier von rechts nach links erklärt):÷4
Kehrwert von 4 (0,25)⎕DL
warte so viele Sekunden (gibt die tatsächlich verstrichene Zeit zurück)⍵⊣
verwerfe das zugunsten von ⍵ (das richtige Argument; das Gitter)⎕←
gib das aus⍉
transponieren⍉⍣⍺
transponiere wieder zurück wenn if (das linke Argument; 0 = runter, 1 = rechts)(
wende den Funktionszug an (hier von links nach rechts erklärt):,⍨
das Argument hing an sich,
angehängt an⊢
selbst)
↓
Matrix in Liste von Listen aufteilen(
Suche nach Regex (hier von links nach rechts erklärt):⍺⊃
wähle eine der folgenden zwei basierend auf ⍺ (0 = unten / zuerst, 1 = rechts / Sekunde)'(↓+) ' '(→+) '
Abwärts- und Linkspfeil, gefolgt von einem Leerzeichen)⎕R' \1'
Ersetzen Sie durch ein Leerzeichen, gefolgt von der gefundenen Sequenz↑
Liste der Listen in Matrix mischen⍉
transponierend[⍺]↓
"height" -Zeilen löschen, wenn ⍺ (linkes Argument) 0 (nach unten) ist, oder "width" -Zeilen löschen, wenn ⍺ 1 (rechts) istd[⍺]↑
Nehmen Sie dann so viele Zeilen⊢
passieren (dient als Trennzeichen)⍉⍣⍺
transponiere wenn ⍺ (das linke Argument; 0 = unten, 1 = rechts)}
' ↓→'[
indexiere den String mit (hier von rechts nach links erklärt):⎕
numerische Eingabe (Maße)d←
ordne das d zu×/
multiplizieren Sie die Dimensionen (findet die Anzahl der Zellen)c←
weise das zu c⎕×
multiplizieren Sie das mit numerischer Eingabe (die Dichte)⌊
abrunden1 2⍴⍨
Wiederholen Sie zyklisch eins und zwei bis zu dieser Längec↑
verlängern Sie das, bis Länge c , Auffüllen mit Nullend⍴
Verwenden Sie d (die Abmessungen), um die Form zu ändern{
wende diese anonyme Funktion darauf an (hier von links nach rechts erklärt):⍵[
das richtige Argument (die Liste der Nullen, Einsen und Zweien), indiziert durch?⍨
die gemischten Indizes bis zu⍴⍵
die Länge des Arguments]
}
]
{
wende die folgende anonyme Funktion an (von rechts nach links erklärt):0S⍵
wende S mit 0 (nach unten) als linkes Argument und das Gitter als rechtes Argument an1S
Wenden Sie mit diesem als rechtes Argument S mit 1 (rechts) als linkes Argument an}⍣≡
bis zwei aufeinanderfolgende Iterationen identisch sind (ein Stau)Anmerkungen
Benötigt
⎕IO←0
, was bei vielen Systemen Standard ist.Fordert zur Eingabe von (Höhe, Breite) und dann zur Eingabe der Dichte auf.
Verwendet keinen eingebauten Automaten.
Verwendet die integrierte Regex-Unterstützung.
Stoppt bei Stau (kein Auto kann sich bewegen).
Gibt Zeichenmatrizen aus, in denen sich
→
Autos nach rechts↓
bewegen, sich nach unten bewegen und Leerzeichen leere Straßen sind.Wie oben erfolgt die Ausgabe an die Sitzung mit 4 Hz, die Frequenz kann jedoch durch Ändern angepasst werden
÷4
. zB÷3
ist 3 Hz und.3
ist ³⁄₁⁄ Hz.Es ist einfacher zu sehen, was passiert, wenn
]Box on -s=max -f=on
zuerst ausgeführt wird.Die erforderliche Aufteilung ist nun gewährleistet, und die beiden Wagentypen kommen bis auf die Rundung genau zu 50% vor.
quelle
↓
. Wenn zwischen ᵈ⁄₂ und d, wird es a→
. Wenn zwischen d und 1, bleibt es leer.0
(weil sie (pseudo-) zufällig (pseudo-) unabhängig erzeugt werden; sehr unwahrscheinlich, aber möglich). Dann ist dein Board voll mit↓
s.Java (624 Bytes + 18 Bytes für Java.awt. * = 642 Bytes)
Ungolfed:
Bild:
quelle