Tulis program atau fungsi yang menggunakan tiga bilangan bulat, lebar w
, tinggi h
, dan jumlah langkah s
. Anda akan menggambar langkah-langkah berjalan acak yang tidak memotong-sendiri s
jauh pada gambar 5*w
dengan 5*h
piksel di mana setiap sel 5 dengan 5 piksel kosong (beige murni) atau salah satu dari dua belas "pipa" sederhana ini:
Gambar di atas diperbesar untuk menampilkan detail. Berikut adalah ukuran pipa sebenarnya:
(Garis abu-abu hanya untuk memisahkan jenis pipa.)
Jalan acak akan menjadi jalur pipa kontinu tunggal yang dimulai pada satu titik ujung pipa (salah satu dari empat tipe pipa terbawah) dan berakhir di titik ujung pipa lainnya.
Mulai dengan kotak kosong w
oleh h
dan pilih satu sel secara acak untuk menjadi titik awal. Kemudian secara acak pilih salah satu dari empat arah untuk memulai dan menggambar titik akhir pipa yang sesuai. Sel awal ini menandai langkah pertama dalam berjalan Anda dan setiap kali Anda menggambar sel baru atau menimpa yang sudah ada itu dihitung sebagai langkah lain yang diambil.
Sekarang, berulang kali, pilih secara acak ke kanan, kiri, atau lurus, gambar sel pipa yang sesuai jika arah yang dipilih valid. Mundur dan pilih kembali jika arah tidak valid sampai s
jalur langkah lengkap terbentuk. Jalur harus diakhiri dengan titik akhir pipa, yang mungkin ada di mana saja di grid, tergantung pada jalur yang diambil.
Sangat penting untuk dicatat bahwa hanya dua sel pipa lurus yang dapat ditimpa, dan hanya dengan sel pipa lurus dengan orientasi yang berlawanan, hasilnya adalah sel persimpangan. Kalau tidak, semua pipa harus ditempatkan di sel kosong.
Ketika persimpangan diambil, bagian jalur yang lebih jauh dari sel awal harus digambarkan di atas.
Terserah Anda apakah grid memiliki syarat batas periodik (PBC) atau tidak, yaitu apakah pipa yang keluar dari satu sisi grid akan keluar di sisi lain. Tanpa PBC, batas grid dihitung sebagai penghalang yang bisa Anda temui seperti pipa lainnya.
Kasus Khusus
- Kapan
s
0 tidak ada pipa yang harus ditarik dan output harus kosong5*w
oleh5*h
gambar (yaitu semua krem). Kapan
s
1 stub pipa tunggalharus ditarik pada sel awal yang dipilih secara acak.
Detail lainnya
- Anda dapat berasumsi bahwa
s
palingw*h
banyak jalan akan selalu memungkinkan. (Meskipun jalur yang lebih panjang dimungkinkan karena persimpangan.) w
danh
akan selalu positif.- Semua pilihan acak harus seragam acak. mis. Anda tidak boleh menghindari membuat persimpangan ketika memungkinkan bahkan jika itu membuat masalah lebih mudah. Generator angka pseudo-acak diizinkan.
- Tiga warna yang berbeda secara visual dapat digunakan sebagai pengganti warna hitam, biru, dan krem.
- Gambar output Anda dapat diperbesar sehingga benar-benar
5*w*k
oleh5*h*k
piksel di manak
bilangan bulat positif. (Memperbesar setiap contoh yang Anda posting disarankan meskipun Andak
1.) - Setiap format file gambar lossless umum dapat digunakan dan gambar dapat disimpan ke file, ditampilkan, atau dimuntahkan mentah ke stdout.
Kode terpendek dalam byte menang.
Contohnya
(Semua diperbesar 500%.)
Jika inputnya w=2, h=1, s=0
maka output akan selalu:
Jika inputnya w=2, h=1, s=1
maka output akan menjadi salah satu gambar ini dengan peluang yang sama:
Jika inputnya w=2, h=1, s=2
maka output akan menjadi
atau mungkin
jika grid diasumsikan memiliki PBC.
(Perhatikan bahwa memulai jalur seperti akan membuat langkah kedua menjadi tidak mungkin.)
Berikut adalah beberapa kemungkinan keluaran w=3, h=2, s=6
, dengan asumsi PBC:
Berikut ini adalah kemungkinan output untuk w=3, h=3, s=9
, dengan asumsi PBC:
Perhatikan bahwa jalur tidak perlu menutupi semua sel karena penghitungan persimpangan adalah dua langkah. Juga, kita dapat menyimpulkan bahwa titik akhir sudut adalah sel awal karena jembatan penyimpangan pasti telah ditarik sesudahnya. Dengan demikian kita dapat menyimpulkan urutan pilihan acak yang dibuat:
start at top left, facing east
go straight
go right
go right
go right
go straight
go left
go right
end
Akhirnya, berikut adalah contoh w=4, h=5, s=20
dan w=4, h=5, s=16
:
sumber
You will be drawing a non-self-intersecting random walk
... apakah itu berpotongan sendiri atau tidak?Jawaban:
CJam, 274
Cobalah online
Menggunakan PBC, output dalam format PGM. Anda dapat menghapus
:+
dekat akhir untuk mendapatkan output visual yang lebih bagus di browser.Sangat lambat untuk input yang lebih besar, terutama jika jumlah langkah dekat dengan area.
Contoh hasil untuk input
4 3 10
(skala 500%):Penjelasan singkat:
Pendekatan umum adalah:
sumber
QBasic,
517516 bytew
,,h
dans
dari input pengguna, dipisahkan oleh koma.Pendekatan di sini adalah untuk mencoba arah acak pada setiap langkah dan memulai kembali dari awal jika itu menghasilkan langkah yang tidak valid. Kami menggambar pipa sesuai petunjuk yang ditentukan, dan digunakan
POINT
untuk menguji poin di layar untuk kondisi validitas kami. Suatu langkah valid jika tidak melampaui batas grid dan:Seperti jawaban CJam dari aditsu , kode ini sangat lambat, dan bisa sangat lambat jika
s
hanya sebagian kecil sajaw*h
. Pada pengaturan QB64 saya, muncul dengan jawaban untuk5,5,19
cukup cepat, tetapi membutuhkan waktu lebih lama daripada yang saya tunggu5,5,20
.Jika Anda ingin menjalankan contoh yang lebih besar / lebih padat, inilah pendekatan asli saya menggunakan pencarian kedalaman-pertama . Ini jauh lebih efisien, dengan biaya 300 byte ekstra.
Contoh output untuk input
10, 10, 100
, ukuran sebenarnya:Versi yang lebih keren dapat ditemukan di intisari ini . Selain tidak dikomentari dan dikomentari secara menyeluruh, ini meningkatkan skala output dengan faktor konstan dan memungkinkan penundaan set di antara langkah-langkah, memungkinkan Anda untuk menonton algoritma DFS di tempat kerja. Berikut ini contoh yang dijalankan:
sumber