Bayangkan seorang pembakar berjalan di sekitar kota dan mengambil korbannya sesuai dengan pola yang sangat spesifik (Atau, sebagai alternatif, Bayangkan seekor lebah terbang di sekitar taman dan memetik bunga-bunganya untuk diserbuki menurut pola yang sangat spesifik ). Katakanlah kota adalah matriks N × N , di mana N adalah bilangan bulat yang lebih tinggi dari atau sama dengan 2 . Pembakar memulai dari sudut kiri atas dan berturut-turut menetapkan titik M rumah di depan mereka (di mana M adalah jumlah rumah tempat mereka berada saat ini), sambil mengubah arahnya bergerak setelah setiap kebakaran, dalam urutan Timur, Selatan, Barat, Utara, Timur, Selatan, dan seterusnya. Lagu pengantar tidur itudari pelaku pembakaran adalah nilai M yang membuat mereka keluar dari kota (yaitu rumah terakhir yang mereka kunjungi sebelum menghentikan kekejian). Ini adalah cara yang lebih mudah untuk dipahami dengan sebuah contoh. Sebagai contoh, ambil matriks berikut:
3 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Kita mulai di sudut kiri atas, jadi M = 3 (
X
menandai posisi saat ini dan sebelumnya dari pelaku pembakaran):X 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Menurut urutan yang diketahui, pertama kali menuju ke timur M (3) tempat dan mendarat pada 2 sehingga M berubah sesuai:
X 2 3 X 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Lalu pergi ke selatan 2 tempat dan M sekarang 1 :
X 2 3 X 7 3 1 4 1 6 2 5 3 X 1 4 4 3 2 4 1 1 1 1 1
- Sekarang bergerak 1 tempat ke Barat dan M menjadi 3 :
X 2 3 X 7 3 1 4 1 6 2 5 XX 1 4 4 3 2 4 1 1 1 1 1
- Setelah bergerak 3 titik ke utara, ia keluar kota! Karena itu, 3 adalah lagu pengantar tidur pembakar ini:
X X 2 3 X 7 3 1 4 1 6 2 5 XX 1 4 4 3 2 4 1 1 1 1 1
Diberi matriks N × N (Anda juga dapat mengambil N sebagai input), temukan pengantar tidur sang pelaku pembakaran. Saya telah menulis sebuah program yang dengannya Anda dapat menghasilkan lebih banyak kasus uji dan memvisualisasikan jalur pelaku pembakaran: Cobalah secara online!
- Anda dapat berasumsi bahwa pelaku pembakaran memang memiliki lagu pengantar tidur (yaitu, ia benar-benar dapat keluar dari matriks).
- Matriks hanya akan berisi bilangan bulat positif kurang dari atau sama dengan 9 (digit), untuk kesederhanaan. Solusi yang menangani bilangan bulat positif sangat disambut.
- Perhatikan bahwa pelaku pembakaran dapat mendarat di tempat yang telah mereka bakar, kalau-kalau perasaan mereka berbeda dari yang pertama kali. Dalam skenario seperti itu, ambil saja nilai elemen itu dan bergerak lagi seperti biasa.
- Anda dapat bersaing dalam bahasa pemrograman apa pun dan dapat mengambil input dan memberikan output melalui metode standar apa pun , sambil memperhatikan bahwa celah ini dilarang secara default. Ini adalah kode-golf , jadi pengiriman terpendek (dalam byte) untuk setiap bahasa menang.
Uji kasus
------------- 9 2 3 1 7 2 8 7 6 Lagu pengantar tidur: 9 ------------- 2 1 2 1 3 1 1 2 1 2 2 1 1 1 1 3 Lagu pengantar tidur: 2 ------------- 3 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1 Lagu pengantar tidur: 3 ------------- 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 Lagu pengantar tidur: 2 ------------- 3 2 1 2 1 1 1 2 3 2 3 2 1 1 2 1 1 1 3 1 2 3 1 1 1 1 1 1 4 5 2 3 1 1 1 1 2 1 2 1 2 2 1 2 2 3 2 1 2 Lagu pengantar tidur: 3 -------------
Matriks dalam format yang berbeda:
[[9, 2, 3], [1, 7, 2], [8, 7, 6]] [[2, 1, 2, 1], [3, 1, 1, 2], [1, 2, 2, 1], [1, 1, 1, 3]] [[3, 2, 3, 2, 7], [3, 1, 4, 1, 6], [2, 5, 3, 1, 1], [4, 4, 3, 2, 4], [ 1, 1, 1, 1, 1]] [[1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2]] [[3, 2, 1, 2, 1, 1, 1], [2, 3, 2, 3, 2, 1, 1], [2, 1, 1, 1, 3, 1, 2]], [ 3, 1, 1, 1, 1, 1, 1], [4, 5, 2, 3, 1, 1, 1], [1, 2, 1, 2, 1, 2, 2, 2], [1, 2, 2, 3, 2, 1, 2]]
Kasus uji kelima sangat menarik untuk divisualisasikan .
sumber
Jawaban:
MATL , 32 byte
Cobalah online! Atau verifikasi semua kasus uji .
Bagaimana itu bekerja
Matriks input diisi dengan bingkai lima nol, jadi misalnya
menjadi
Bingkai nol digunakan untuk mendeteksi ketika lebah
pembakartelah keluar dari matriks. Perpanjangan dengan lima nol memastikan bahwa perpindahan modular dengan panjang hingga ke9
arah mana pun dari salah satu entri bukan nol akan mendarat dengan benar di nol tanpa membungkus beberapa entri non-nol.Dalam koordinat matriks, lebah mulai saat masuknya
(6,6)
matriks yang diperluas. Bunyinya entri itu, dan memperbarui koordinat yang diperlukan, menerapkan perpindahan (modular) dari panjang baca ke arah yang sesuai. Ini diulang dalam satu lingkaran sampai nilai baca adalah0
. Entri yang telah dibaca sebelum itu (yaitu entri bukan nol terakhir) adalah output.Koordinat sebenarnya disimpan sebagai bilangan kompleks, jadi misalnya
(6,6)
menjadi6+6j
. Dengan cara ini empat arah siklik dapat direalisasikan sebagai kekuatan unit imajiner. Kekuatan yang sesuai (j
,1
,-j
atau-1
) dikalikan dengan masuknya membaca untuk mendapatkan perpindahan kompleks yang digunakan untuk memperbarui koordinat.Nilai yang dibaca berturut-turut disimpan di tumpukan. Ketika loop keluar, tumpukan berisi semua nilai baca non-nol secara berurutan, lalu nilai baca terakhir
0
, lalu koordinat kompleks terbaru. Jadi elemen ketiga atas adalah output yang dibutuhkan.sumber
JavaScript (ES6),
7068 byteCobalah online!
Berkomentar
Mengingat bahwa tanda modulo di JS adalah dividen, arahnya diperbarui seperti ini:
sumber
Arang ,
2518 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Cetak string input, tetapi jangan gerakkan posisi cetak.
Putar pivot ke kiri, sehingga arah cetak sekarang naik.
Ulangi saat ada karakter di bawah posisi cetak.
Simpan karakter dalam sebuah variabel.
Keluarkan karakter ke angka dan cetak banyak baris baru. Karena arah cetak sekarang naik, ini berakhir dengan mencetak horizontal. Hasilnya adalah bahwa kami telah memindahkan posisi cetak ke arah yang diinginkan dengan jumlah yang diberikan oleh nomor di bawah posisi cetak.
Putar pivot sehingga baris baru berikutnya memindahkan posisi cetak searah dengan jarum jam untuk lintasan loop berikutnya.
Sayangnya kami masih memiliki input yang mengacaukan kanvas kami, dan bahkan lebih sialnya, jika kami membersihkan kanvas kami juga menghapus variabel kami. Jadi, ini sedikit trik: daftar string kosong dan variabel dilingkarkan. Pada pass pertama dari loop, variabel loop kosong, sehingga kanvas dan variabel loop dan variabel hasil semuanya dihapus. Tetapi loop belum selesai! Pada putaran kedua loop, kita masih bisa mengakses variabel kita dengan hati-hati tersimpan dalam daftar loop kita. Tinggal mencetaknya saja.Bersihkan kanvas dan cetak variabel yang disimpan. (Terima kasih kepada @ ASCII-only untuk perbaikan ke Arang.)
sumber
Python 2 ,
8584 byteCobalah online!
Kiat topi untuk Tn. Xcoder selama 1 byte.
sumber
Arang ,
504946343326 byteCobalah online
Tautan adalah ke versi kode yang verbose
Input harus berupa N pada barisnya sendiri, kemudian baris array pada baris yang terpisah setelah itu.
Segala cara untuk melepaskan byte disambut dan diinginkan, karena saya bukan pegolf yang baik di Charcoal!
-12 byte terima kasih kepada @Neil! -1 byte terima kasih hanya untuk @ ASCII! -7 byte berkat hanya @ ASCII (mengubah bug yang membuat
Clear
variabel reset)sumber
Merah , 145 byte
Cobalah online!
Lebih mudah dibaca:
sumber
Perl 6 , 62 byte
Cobalah online!
Mengambil matriks sebagai daftar datar dan lebar.
sumber
Bersih , 141 byte
Cobalah online!
Menentukan fungsi
? :: {#{#Int}} -> Int
, mengambil larik bilangan bulat tanpa kotak dari bilangan bulat dan mengembalikan hasilnya.sumber
Java 8, 121 byte
Cobalah online.
Alternatif dengan 121 byte byte-count yang sama:
Menggunakan try-akhirnya alih-alih memeriksa apakah
x,y
-coordinate masih dalam batas.Cobalah online.
Penjelasan:
sumber
Perl 5 , 92 byte
Cobalah online!
Bagaimana?
Set peta bersarang dan gabungan menghasilkan ini:
yang kemudian dievaluasi untuk menentukan apakah loop berakhir. Karena Boolean dievaluasi dari kiri ke kanan, nilai
$n
sebenarnya berubah (hingga) empat kali selama evaluasi. Karena sirkuit pendek logika Boolean dalam Perl, nilai$n
adalah pengantar tidur ketika loop keluar.sumber
Python 3 ,
8584 bytexcoder: -1 (Saya tidak pernah ingat + ~ trik)
Cobalah online!
Alih-alih bergerak ke arah yang berbeda (E, S, W, N), solusi ini selalu bergerak ke timur dan memutar konter searah jarum jam setelah setiap gerakan. Setelah berputar, apa yang menjadi kolom terakhir sekarang adalah baris pertama, jadi jika indeks baris kurang dari nol itu berarti kita lari dari papan.
sumber
-d-1
=>+~d
Retina , 161 byte
Cobalah online!
sumber