Model ruchu Biham-Middleton-Levine jest samoorganizujące automat komórkowy, że modele uproszczone ruchu.
Składa się z wielu samochodów reprezentowanych przez punkty na kratce z losową pozycją początkową, przy czym każdy samochód może być jednego z dwóch rodzajów: te, które poruszają się tylko w dół (pokazane w tym artykule jako niebieskie) i te, które poruszają się tylko w kierunku prawo (pokazane w tym artykule na czerwono). Dwa rodzaje samochodów poruszają się na zmianę. Podczas każdej tury wszystkie samochody danego typu przechodzą o jeden krok do przodu, jeśli nie są blokowane przez inny samochód.
Twoim zadaniem jest wizualizacja tego modelu jako animacji. Oto kilka dobrych demonstracji.
Wejście
Liczba zmiennoprzecinkowa od 0 do 1 reprezentująca gęstość oraz dwie liczby całkowite reprezentujące wyświetlaną wysokość i szerokość siatki. Załóżmy, że dane wejściowe są prawidłowe, a parametry funkcji lub odczyt z danych wprowadzonych przez użytkownika są w porządku.
Przykład: 0.38 144 89
(odpowiada powyższemu obrazowi)
Wynik
Siatka o wymiarach co najmniej 80 x 80, która wyświetla animację uruchomionego modelu. Na początku samochody są losowo umieszczane na siatce, aż siatka osiągnie gęstość wejściową, z połową koloru czerwonego i pół niebieską (to jest gęstość razy całkowita liczba kwadratów siatki, zaokrąglona w dowolny sposób). Gęstość musi mieć tę wartość, co oznacza, że nie można wypełnić każdej komórki gęstością jako prawdopodobieństwa. Na każdym kroku jeden rodzaj samochodu porusza się w dół lub w prawo, owijając się, jeśli minie krawędź. Rodzaj poruszającego się samochodu zmienia się na każdym kroku. Aby animacja była widoczna, pomiędzy każdym krokiem musi być co najmniej 10 ms.
Zasady
Samochody mogą być dowolnego koloru lub symbolu, o ile można je odróżnić od siebie i tła, a każdy typ samochodu ma ten sam kolor lub symbol.
Konsola i wyjście graficzne są dozwolone. W przypadku danych wyjściowych z konsoli dowolny symbol do wydruku jest w porządku, ale dane wyjściowe muszą być w postaci siatki znaków.
Proszę określić, jaki rodzaj produkcji uzyskałeś, jeśli nie masz zrzutu ekranu lub gif.
Symulacja musi trwać wiecznie.
Wynik jest nieco złożony, więc jeśli masz jakieś pytania, prosimy o komentarz.
Odpowiedzi:
R,
350338293291273268264 bajtówNie golfowany:
Funkcja, która przyjmuje 3 argumenty:
d
jako gęstość i wymiaryx,y
.q
to liczba samochodów w każdym kolorze.m
to matryca z samochodami, która początkowo jest wypełniana przez losowe sortowanie liczby samochodów i pustych miejsc. Samochody są albo,1
albo jest-1
puste miejsce0
.f
to funkcja, która przesuwa samochody o jeden rząd, patrząc na samochody oznaczone jako1
. Sprawdza, czy samochód może się poruszać, sprawdzając litery1
s, a następnie0
. Używamyapply
do bieganiaf
w każdym rzędzie lub kolumnie, w zależności od tego, jakie samochody.f
obsługuje ruch1
samochodów, aby przenieść-1
samochody, transponujemy matrycę, zmieniając kierunek ruchu, mnożąc matrycę-1
, dzięki czemu-1
samochody stają się1
samochodami, a vv i uzyskana macierz jest ponownie przekształcana.Służy
image
do tworzenia wykresu przy użyciu 3 domyślnych kolorów dla trzech wartości. Używaanimation
pakietu do obsługi animacji przy użyciu domyślnych opcji, czyli 1 fps.0.38, 144, 89:
0.2, 144, 89:
0.53, 144, 89:
źródło
0.38 144 89
przykład z przykładu.Mathematica,
237228203198181 bajtówDane wyjściowe są dynamiczne
Image
. Tło jest jasnozielone, a samochody są czarne lub purpurowe, w zależności od ich kierunku.Wyjaśnienie
Utwórz początkową tablicę:
Ustaw
i
na2
. TworzenieList
z{0, 2}
, którego długość jest podłoga (gęstość * * wysokość szerokość / 2) (dzieli się przez dwa, ponieważ{0, 2}
jest długości 2).Przekształć powstałe 2-D
List
(2 x coś) w 1-DList
(długość = szerokość * wysokość). Pad,1
jeśli nie ma wystarczających wartości.(Pseudo-) losowo sortuje wynik.
Podział, którego wynikiem jest długość (szerokość).
Przechowuj to w
b
.Utwórz
Dynamic
Image
:Odwróć znak
i
.Zastosuj automat komórkowy z regułami
193973693
i obciążnikami sąsiadującymi{{0, 0, 0}, {3, 9, 1}, {0, 0, 0}}
dob
transpozycji. Zestawb
równy.Jeśli
i
jest pozytywny, zostaw wb
spokoju. Jeśli nie, transponujb
(2-
jest tam, boCellularAutomaton
trochę grałem w golfa ). Zasadniczo transponuje tob
każdą inną iterację (aby cofnąć transpozycję)Przekształć tablicę w kolorowy
Image
.Zrób wyrażenie
Dynamic
. tzn. powyższe funkcje są uruchamiane wielokrotnie.Wynik
Oto przykładowe wyjście (dane wejściowe:)
0.35, 192, 108
dla 2000 klatek (powiększenie 2x).https://i.imgur.com/zmSyRut.mp4
źródło
Dyalog APL ,
190108115112 bajtówRozwiązanie
TryAPL online (nieco zmodyfikowany z powodu ograniczeń online):
Zestaw
⎕IO←0
, określenie funkcji S , a następnie określić, a na losowy 38% 14 x 29 siatki, G .Zrób jeden ruch w dół.
Wykonaj jeden ruch w prawo.
Przejdź do kroku 2.
Animacja poprzedniego algorytmu, który nie gwarantował gęstości.
Wyjaśnienie
S←{
zdefiniuj funkcję bezpośrednią S (wyjaśnioną tutaj od prawej do lewej):÷4
odwrotność 4 (0,25)⎕DL
poczekaj tyle sekund (zwraca rzeczywisty czas, który upłynął)⍵⊣
odrzuć to na korzyść ⍵ (właściwy argument; siatka)⎕←
wydać to⍉
transponować⍉⍣⍺
transponuj ponownie, jeśli ⍺ (lewy argument; 0 = w dół, 1 = w prawo)(
zastosuj ciąg funkcji (wyjaśniony tutaj od lewej do prawej):,⍨
argument przyłączył się do siebie,
dołączone do⊢
samo)
↓
podziel macierz na listę list(
szukaj wyrażenia regularnego (wyjaśnione tutaj od lewej do prawej):⍺⊃
wybierz jeden z dwóch następujących na podstawie ⍺ (0 = w dół / pierwszy, 1 = w prawo / drugi)'(↓+) ' '(→+) '
sekwencje strzałek w dół i w lewo, a następnie spacja)⎕R' \1'
zamień na spację, po której następuje znaleziona sekwencja↑
zmieszaj listę list w macierz⍉
transponowaćd[⍺]↓
upuść wiersze „wysokość”, jeśli ⍺ (lewy argument) wynosi 0 (w dół) lub „szerokość” wierszy, jeśli ⍺ jest 1 (prawy)d[⍺]↑
następnie weź tyle wierszy⊢
przejść przez (służy jako separator)⍉⍣⍺
transponuj, jeśli ⍺ (lewy argument; 0 = w dół, 1 = w prawo)}
' ↓→'[
indeksuj ciąg za pomocą (wyjaśnione tutaj od prawej do lewej):⎕
wprowadzanie numeryczne (wymiary)d←
przypisz to do d×/
pomnóż wymiary (znajdzie liczbę komórek)c←
przypisz to do c⎕×
pomnóż to przez wprowadzanie numeryczne (gęstość)⌊
zaokrąglić w dół1 2⍴⍨
cyklicznie powtarzaj jeden i dwa do tej długościc↑
przedłuż to do długości c , dopełniając zeramid⍴
użyj d (wymiary), aby zmienić kształt{
zastosuj do tego tę anonimową funkcję (wyjaśnioną tutaj od lewej do prawej):⍵[
prawy argument (lista zer, jedynek i dwójek) indeksowany według?⍨
przetasowane wskaźniki do⍴⍵
długość argumentu]
}
]
{
zastosuj następującą anonimową funkcję (wyjaśnioną od prawej do lewej):0S⍵
zastosuj S z 0 (w dół) jako lewym argumentem, a grid jako prawym argumentem1S
z tym jako prawym argumentem, zastosuj S z 1 (prawym) jako lewym argumentem}⍣≡
dopóki dwie kolejne iteracje nie będą identyczne (korek drogowy)Notatki
Wymaga
⎕IO←0
, co jest domyślne w wielu systemach.Monituje o (wysokość, szerokość), a następnie o gęstość.
Nie korzysta z żadnego wbudowanego automatu.
Korzysta z wbudowanej obsługi wyrażeń regularnych.
Zatrzymuje się w przypadku korka (żaden samochód nie może się poruszać).
Generuje macierze znaków, w których
→
reprezentuje samochody poruszające się w prawo,↓
samochody poruszające się w dół, a spacje są pustymi drogami.Jak wyżej, sygnał wyjściowy jest przesyłany do sesji przy częstotliwości 4 Hz, ale częstotliwość można regulować, zmieniając
÷4
; np.÷3
wynosi 3 Hz i.3
wynosi ³⁄₁₀ Hz.Łatwiej jest zobaczyć, co się dzieje, jeśli jest wykonywane
]Box on -s=max -f=on
najpierw.Wymagana dystrybucja jest teraz gwarantowana, a dwa typy samochodów występują dokładnie w 50-50, z wyjątkiem zaokrąglania.
źródło
↓
. Jeśli pomiędzy ᵈ⁄₂ id staje się a→
. Jeśli między d i 1 pozostaje pusty.0
(ponieważ są (pseudo) losowo generowane (pseudo) niezależnie, bardzo nieprawdopodobne, ale możliwe). Twoja tablica jest pełna↓
s.Java (624 bajtów + 18 bajtów dla Java.awt. * = 642 bajtów)
Nie golfowany:
Obrazek:
źródło