The Model lalu lintas Biham-Middleton-Levine adalah robot seluler mengorganisir diri bahwa model disederhanakan lalu lintas.
Ini terdiri dari sejumlah mobil yang diwakili oleh titik-titik pada kisi-kisi dengan posisi awal acak, di mana masing-masing mobil mungkin salah satu dari dua jenis: yang hanya bergerak ke bawah (ditunjukkan dengan warna biru dalam artikel ini), dan yang hanya bergerak ke arah kanan (ditampilkan sebagai merah di artikel ini). Kedua jenis mobil itu bergiliran bergerak. Selama setiap belokan, semua mobil untuk tipe yang sesuai maju satu langkah jika tidak diblokir oleh mobil lain.
Tugas Anda adalah memvisualisasikan model ini sebagai animasi. Berikut ini beberapa demonstrasi yang bagus.
Memasukkan
Angka titik mengambang antara 0 dan 1 mewakili kerapatan, dan dua bilangan bulat mewakili tinggi dan lebar kisi yang ditampilkan. Asumsikan input valid, dan parameter ke fungsi atau membaca dari input pengguna baik-baik saja.
Contoh: 0.38 144 89
(sesuai dengan gambar di atas)
Keluaran
Kotak, setidaknya 80x80, yang menampilkan animasi dari model ini berjalan. Pada awalnya, mobil ditempatkan secara acak di grid sampai grid mencapai kepadatan input, dengan setengah merah dan setengah biru (yaitu kepadatan kali jumlah total kotak kuadrat, bulat bagaimanapun Anda suka). Kerapatan harus berupa nilai ini, yang berarti Anda tidak dapat mengisi setiap sel dengan kerapatan sebagai probabilitas. Untuk setiap langkah, satu jenis mobil bergerak ke bawah atau ke kanan, membungkus jika melewati tepi. Jenis mobil yang bergerak bergantian setiap langkah. Untuk membuat animasi dapat dilihat, harus ada setidaknya 10 ms antara setiap langkah.
Aturan
Mobil dapat berupa warna atau simbol apa pun selama mereka dapat dibedakan satu sama lain dan latar belakang, dan setiap jenis mobil memiliki warna atau simbol yang sama.
Konsol dan output grafis keduanya diperbolehkan. Untuk output konsol, simbol apa pun yang dapat dicetak baik-baik saja, tetapi output harus berupa kisi-kisi karakter.
Silakan tentukan jenis keluaran apa yang Anda hasilkan jika Anda tidak memiliki tangkapan layar atau gif.
Simulasi harus berjalan selamanya.
Outputnya agak rumit, jadi jika Anda memiliki pertanyaan, silakan komentar.
Jawaban:
R,
350338293291273268264 byteTidak Disatukan:
Fungsi yang mengambil 3 argumen:
d
sebagai kepadatan, dan dimensix,y
.q
adalah jumlah mobil di setiap warna.m
adalah matriks dengan mobil, yang pada awalnya diisi dengan mengambil secara acak jumlah mobil dan ruang kosong. Mobil adalah salah satu1
atau-1
, ruang kosong itu0
.f
adalah fungsi yang menggerakkan mobil satu baris, memandang mobil yang diberi kode1
. Ini memeriksa apakah mobil dapat bergerak dengan memeriksa untuk1
diikuti oleh0
. Kami menggunakanapply
untuk berjalanf
di setiap baris atau kolom, tergantung pada mobil mana.f
menangani pergerakan1
mobil, untuk memindahkan-1
mobil, kami mentransposisikan matriks, menyalurkan arah pergerakan, mengalikan matriks dengan-1
, sehingga-1
mobil menjadi1
mobil, dan vv dan matriks yang dihasilkan ditransformasikan kembali.Ini digunakan
image
untuk membuat plot, menggunakan 3 warna default untuk tiga nilai. Menggunakananimation
paket untuk menangani animasi menggunakan opsi default, yaitu 1 fps.0.38, 144, 89:
0.2, 144, 89:
0.53, 144, 89:
sumber
0.38 144 89
itu contohnya.Mathematica,
237228203198181 byteOutputnya adalah dinamis
Image
. Latar belakangnya hijau muda, dan mobil-mobil itu berwarna hitam atau magenta, tergantung pada arahnya.Penjelasan
Buat papan awal:
Setel
i
ke2
. BuatList
dari{0, 2}
, yang panjangnya lantai (density * lebar * tinggi / 2) (dibagi dua karena{0, 2}
merupakan panjang-2).Bentuk kembali 2-D yang dihasilkan
List
(2 x sesuatu) menjadi 1-DList
(panjang = lebar * tinggi). Pad1
jika tidak ada nilai yang cukup.(Pseudo-) secara acak mengurutkan hasilnya.
Partisi itu menghasilkan panjang (lebar).
Simpan itu di
b
.Buat
Dynamic
Image
:Balikkan tanda
i
.Terapkan otomat seluler dengan aturan
193973693
dan bobot tetangga{{0, 0, 0}, {3, 9, 1}, {0, 0, 0}}
untukb
ditransposisikan. Setb
sama dengan itu.Jika
i
positif, biarkanb
sendiri. Jika tidak, transposb
(2-
ada karena sayaCellularAutomaton
bermain golf sedikit). Pada dasarnya, ini mentransposb
setiap iterasi lainnya (untuk membatalkan transposisi)Ubah array menjadi warna-warni
Image
.Buat ekspresi
Dynamic
. yaitu fungsi di atas dijalankan berulang kali.Keluaran
Berikut ini contoh output (input:)
0.35, 192, 108
untuk 2000 frame (diperbesar 2x).https://i.imgur.com/zmSyRut.mp4
sumber
Dyalog APL ,
190108115112 byteLarutan
TryAPL online (sedikit dimodifikasi karena batasan online):
Set
⎕IO←0
, mendefinisikan fungsi S , dan kemudian menentukan dan menampilkan random 38% 14 × 29 grid, G .Buat satu langkah ke bawah.
Lakukan satu gerakan ke kanan.
Lanjutkan ke langkah 2.
Animasi algoritma sebelumnya, yang tidak menjamin kepadatan.
Penjelasan
S←{
tentukan fungsi langsung S (dijelaskan di sini dari kanan ke kiri):÷4
kebalikan dari 4 (0,25)⎕DL
tunggu beberapa detik (mengembalikan waktu yang sebenarnya berlalu)⍵⊣
Buang yang mendukung ⍵ (argumen yang tepat; kisi)⎕←
output itu⍉
mengubah urutan⍉⍣⍺
transpos kembali lagi jika ⍺ (argumen kiri; 0 = turun, 1 = kanan)(
terapkan kereta fungsi (dijelaskan di sini dari kiri ke kanan):,⍨
argumen ditambahkan ke dirinya sendiri,
ditambahkan ke⊢
diri)
↓
membagi matriks menjadi daftar daftar(
search regex (dijelaskan di sini dari kiri ke kanan):⍺⊃
pilih salah satu dari dua berikut berdasarkan ⍺ (0 = bawah / pertama, 1 = kanan / detik)'(↓+) ' '(→+) '
urutan panah bawah dan kiri diikuti oleh spasi)⎕R' \1'
ganti dengan spasi diikuti oleh urutan yang ditemukan↑
mencampur daftar daftar ke dalam matriks⍉
mengubah urutand[⍺]↓
jatuhkan baris "tinggi" jika ⍺ (argumen kiri) adalah 0 (bawah) atau baris "lebar" jika ⍺ adalah 1 (kanan)d[⍺]↑
lalu ambil banyak baris⊢
pass through (berfungsi sebagai pemisah)⍉⍣⍺
transpos jika ⍺ (argumen kiri; 0 = turun, 1 = kanan)}
' ↓→'[
mengindeks string dengan (dijelaskan di sini dari kanan ke kiri):⎕
input numerik (dimensi)d←
tetapkan itu untuk d×/
kalikan dimensi (temukan jumlah sel)c←
menetapkan itu untuk c⎕×
kalikan dengan input numerik (densitas)⌊
bulat ke bawah1 2⍴⍨
ulangi secara siklis satu dan dua sampai sepanjang ituc↑
memperpanjang itu sampai panjang c , padding dengan nold⍴
gunakan d (dimensi) untuk membentuk kembali{
terapkan fungsi anonim ini untuk itu (dijelaskan di sini dari kiri ke kanan):⍵[
argumen yang benar (daftar nol, satu, dan dua) diindeks oleh?⍨
indeks dikocok hingga⍴⍵
panjang argumen]
}
]
{
terapkan fungsi anonim berikut (dijelaskan dari kanan ke kiri):0S⍵
terapkan S dengan 0 (turun) sebagai argumen kiri dan kisi sebagai argumen kanan1S
dengan argumen yang benar, terapkan S dengan 1 (kanan) sebagai argumen kiri}⍣≡
sampai dua iterasi berturut-turut adalah identik (kemacetan lalu lintas)Catatan
Membutuhkan
⎕IO←0
, yang merupakan standar pada banyak sistem.Anjuran untuk (tinggi, lebar), dan kemudian untuk kepadatan.
Tidak menggunakan otomat bawaan.
Apakah menggunakan dukungan regex bawaan.
Berhenti jika ada kemacetan (tidak ada mobil yang bisa bergerak).
Matriks karakter keluaran di mana
→
mewakili mobil yang bergerak ke kanan,↓
mewakili mobil yang bergerak ke bawah, dan spasi adalah jalan yang kosong.Seperti di atas, output ke sesi pada 4 Hz, tetapi frekuensi dapat disesuaikan dengan mengubah
÷4
; misal÷3
3 Hz dan.3
³⁄₁₀ Hz.Lebih mudah untuk melihat apa yang terjadi jika mengeksekusi
]Box on -s=max -f=on
terlebih dahulu.Distribusi yang diperlukan sekarang dijamin, dan dua jenis mobil terjadi tepat 50-50, kecuali untuk pembulatan.
sumber
↓
,. Jika antara ᵈ⁄₂ dan d itu menjadi a→
. Jika antara d dan 1 tetap kosong.0
(karena mereka (pseudo) - dihasilkan secara acak (pseudo) - secara independen; sangat tidak mungkin tetapi mungkin). Maka papan Anda penuh dengan↓
s.Java (624 Bytes + 18 Bytes untuk Java.awt. * = 642 Bytes)
Tidak Disatukan:
Gambar:
sumber