Untuk mensimulasikan invasi zombie, mulailah dengan kisi #
dan yang mewakili peta:
## ##
### #
## ##
# ###
# ####
#
mewakili tanah.mewakili air.
Zombi dimulai pada titik di peta ...
## ##
### #
## %#
# ###
# ####
... dan menyebar. %
menunjukkan tanah yang terinfeksi oleh zombie.
Namun, zombie tidak bisa berenang . Mereka dapat bergerak melintasi tanah dengan cara yang sama seperti seorang raja bergerak dalam catur - satu kotak di setiap arah diagonal atau ortogonal:
!!!
!%!
!!!
Di akhir simulasi, beberapa lahan akan terinfeksi zombie:
%% ##
%%% #
%% %%
% %%%
# %%%%
Tugas Anda adalah untuk mensimulasikan invasi zombie. Tulis program (atau fungsi) yang mengambil input string yang mewakili keadaan awal grid, dan dua angka yang mewakili koordinat zombie awal. Program harus menampilkan (atau mengembalikan) keadaan akhir invasi.
Spesifikasi
- Program Anda dapat mencetak baris tambahan opsional.
- Anda dapat berasumsi bahwa input akan berada dalam format yang benar (diisi dengan spasi), dengan baris tambahan opsional.
- Anda dapat mengasumsikan zombie awal akan mulai di darat dan tidak akan langsung mati.
- Ini adalah kode-golf , jadi jawaban tersingkat (dalam byte) menang.
- -100% bonus jika kode Anda juga dapat menyelesaikan Masalah Pemutusan untuk mesin Turing yang berubah-ubah.
- Program Anda harus menangani lebar papan hingga 50 karakter.
code-golf
ascii-art
simulation
Buah Esolanging
sumber
sumber
Jawaban:
APL (Dyalog) , 44 byte
Cobalah online!
Diasumsikan
⎕IO←0
.Argumen kiri: 0-indexed row
r
of%, 0-indexed kolomc
of%:r c
Argumen kanan: Character matrix
sumber
Kotlin,
283218 byteLambda tanpa nama (dengan fungsi bersarang, heh).
Golf
Tidak disatukan
Menyimpan beberapa byte dengan beralih ke solusi rekursif.
sumber
JavaScript (ES6), 144 byte
Dimana
\n
mewakili karakter baris baru literal. Membawa koordinat 0-diindeks.sumber
Befunge,
324323 byteCobalah online!
Penjelasan
Menerapkan ini di Befunge sedikit rumit karena kita terbatas pada 80x25 karakter "memori" yang harus dibagikan dengan kode sumber itu sendiri. Trik untuk memasang peta 50x50 ke area itu adalah meratakan peta 2D ke dalam array 1D dengan dua lokasi peta per byte. Array 1D ini kemudian dibungkus menjadi array 2D lagi sehingga bisa masuk dalam lebar 80 karakter dari arena bermain Befunge.
Algoritma infeksi dimulai dengan mengubah koordinat awal menjadi offset di larik 1D yang didorong ke tumpukan. Loop utama mengambil nilai dari stack dan mencari status peta untuk offset itu. Jika itu adalah tanah yang tidak terinfeksi, maka akan ditandai sebagai terinfeksi, dan delapan offset baru didorong ke tumpukan (mewakili tanah di sekitar posisi saat ini). Proses ini berlanjut hingga tumpukan kosong.
Untuk menghindari keharusan memeriksa nilai di luar kisaran, peta disimpan dengan batas air satu karakter di sekitar semua tepi.
sumber
Pip , 59 byte
Sebuah fungsi yang mengambil string multiline, deretan zombie awal (0-diindeks), dan kolom zombie awal (0-diindeks). Cobalah online!
Bagaimana?
Karena Pip memiliki pengindeksan siklus (biasanya hal yang baik, tetapi buruk untuk masalah ini karena kami tidak ingin tepi peta untuk membungkus), saya pergi untuk solusi penggantian regex.
Ya@?n
menemukan indeks baris baru pertama (yaitu lebar kotak) dan menariknya ke dalamy
.(ac+b+b*Ya@?n):'%
setelah melakukan hal di atas, hitung(width + 1) * row + col
, yaituc+b+b*y
, dan set karakter pada indeks itu menjadi%
.L2*#a
loop2*len(a)
kali, yang memberi kita iterasi yang cukup untuk mengisi banjir untuk sepenuhnya menyebar dan memastikan jumlah iterasi genap (itu penting)..`#(.?.?.{`.y-1.`})?%`
membangun regex yang cocok dengan#
diikuti oleh%
, dengan 0, lebar-1, lebar, atau lebar + 1 karakter di antaranya. (The.
di awal membuat.
di regex match newlines.) Regex ini cocok dengan salah satu dari konfigurasi berikut:aR ... '%.@>_
mengganti korek api regex ini dengan karakter yang%
didahulukan untuk.
semua kecuali karakter pertama@>
dari korek api_
; singkatnya, mengganti#
dengan%
.a:RV ...
membalikkan itu dan mengembalikannya kea
. Kami membalikkan karena regex hanya cocok#
sebelum%
di string, bukan setelah; tetapi ketika string dibalik, setelah menjadi sebelum dan kita bisa mencocokkannya pada iterasi berikutnya. Ini juga mengapa jumlah iterasi harus genap.Setelah loop selesai, kami cukup mengembalikan nilai yang dimodifikasi dari
a
.sumber
TSQL, 267 byte
Golf:
Tidak Disatukan:
Cobalah
sumber
PHP,
209189188183 bytemungkin golf
Jalankan dengan
php -r '<code>' '<grid>' <y> <x>
sumber
J, 152 Bytes
Tidak bermain golf dengan baik, saya yakin ada cara untuk menghapus beberapa struktur kontrol terakhir.
Menerapkan algoritma pengisian banjir. Fungsi g memformat input ke dalam array karakter sebelum menerapkan f.
Perhatikan bahwa koordinat agak aneh:
adalah sudut kiri atas. Meningkatkan koordinat pertama:
Memindahkan posisi ke bawah ke arah y.
Selain itu koordinatnya normal.
Contoh:
sumber