Labirin es telah menjadi salah satu kebutuhan pokok gim Pokémon saya sejak debut mereka di Pokémon Gold and Silver. Tugas Anda adalah membuat program yang memecahkan masalah jenis ini.
Labirin es terutama terdiri dari, seperti namanya, es. Setelah pemain bergerak ke arah di atas es, mereka akan terus bergerak ke arah itu sampai mereka bertabrakan dengan beberapa rintangan. Ada juga tanah yang dapat dipindahkan secara bebas dan akan menghentikan pemain yang bergerak melewatinya. Rintangan terakhir adalah batu. Stone tidak dapat menempati ruang yang sama dengan pemain dan jika pemain mencoba untuk pindah ke dalamnya mereka akan berhenti bergerak sebelum mereka bisa.
Anda akan menerima wadah nilai dua dimensi, seperti daftar daftar atau string yang dipisahkan oleh baris baru, yang berisi 3 nilai berbeda untuk masing-masing dari 3 jenis lantai (Es, Tanah, dan Batu). Anda juga akan menerima dua pasangan (atau dua wadah bernilai setara lainnya) yang mengindikasikan koordinat awal dan tujuan dalam labirin. Ini mungkin nol atau satu diindeks.
Anda harus mengeluarkan daftar gerakan (4 nilai berbeda dengan bijih ke N, E, S, W) yang akan menyebabkan pemain tiba di akhir saat dijalankan.
Input akan selalu memiliki batas batu yang tertutup di sekitar labirin sehingga Anda tidak perlu khawatir tentang pemain yang keluar dari labirin
Ini adalah kode-golf sehingga byte paling sedikit menang
Uji Kasus
Di sini .
akan mewakili es, ~
akan mewakili tanah, dan O
akan mewakili batu. Koordinat 1 diindeks. Setiap huruf dalam solusi mewakili arah yang dimulai dengan huruf itu (misalnya N
= Utara)
Memasukkan
OOOOO
OO.OO
O...O
OOOOO
Start : 3,3
End : 3,2
Keluaran
N
Memasukkan
OOOOOOOOOOOOOOOOO
O........O.....OO
O...O..........OO
O.........O....OO
O.O............OO
OO.......O.....OO
O.............OOO
O......O.......~O
O..O...........~O
O.............OOO
O.......O......OO
O.....O...O....OO
O..............OO
OOOOOOOOOOOOOO~~O
OOOOOOOOOOOOOOOOO
Start : 15,12
End : 16,8
Keluaran
N,W,N,E,N,E,S,W,N,W,S,E,S,E,N,E,N
Memasukkan
OOOOOOOOOOOOOOOO
O~~~~~OOOOO~~~~O
O~~O~OOOOOOO~~OO
O...O..........O
O........O.....O
O..............O
OO.............O
O.............OO
O....~....O....O
O..............O
O..............O
OOOOOOOOOOOOOOOO
Start : 2,2
End : 14,3
Keluaran
E,S,S,W,N,E,N
Memasukkan
OOOOOOOOOOOOOOOOOOO
O~~~~~~~OOOOOOOOOOO
O~~~~...OOOOOOOOOOO
OO~O~..OOOOOOOOOOOO
O..OO.............O
O..............O..O
O....O............O
O.O............~..O
O........OOOO.....O
O.......OOOOO.....O
O.......O~~~O.....O
O.......~~~~~.....O
O.......~~~~~.....O
O..........O......O
O..O..~...........O
O...............O.O
O.....O...........O
O.................O
OOOOOOOOOOOOOOOOOOO
Start : 2,2
End : 11,11
Keluaran
E,E,E,E,E,S,S,E,N,W,S,E,N,N,N
sumber
Jawaban:
Mathematica, 247 byte
Dengan jeda baris:
Gagasan langsung saya adalah untuk mewakili posisi es dan tanah sebagai simpul dalam grafik dengan tepi terarah sesuai dengan gerakan hukum, lalu gunakan
FindPath
. Orang mungkin berpikir bahwa menentukan langkah hukum akan menjadi bagian yang mudah dan menemukan solusinya akan menjadi bagian yang sulit. Bagi saya, itu kebalikannya. Terbuka untuk saran tentang cara menghitung tepi.Argumen pertama
#
adalah array 2D di mana0
mewakili es,1
mewakili tanah, dan2
mewakili batu.Argumen kedua
#2
dan argumen ketiga#3
adalah titik awal dan akhir, masing-masing, dalam formulir{row,column}
.
adalah 3 byte yangU+F4A1
mewakili karakter penggunaan pribadi\[Function]
.Penjelasan
Menentukan fungsi
p
yang mengambil daftarx
formulir{row,column}
dan output#[[row,column]]
; yaitu nilai es / tanah / batu pada koordinat tersebut.Menentukan fungsi
m
yang mengambil posisi awalc
dan arah vektorv
dan secara rekursif menentukan di mana Anda akan berakhir. Jikac+v
es, maka kami terus meluncur dari titik itu, jadi itu kembalim[c+v,v]
. Jikac+v
tanah, maka kita bergerak kec+v
dan berhenti. Kalau tidak (jikac+v
batu atau di luar batas), Anda tidak bergerak. Perhatikan bahwa ini hanya dimaksudkan untuk dipanggil pada posisi es atau tanah.Menentukan daftar
g
posisi es dan tanah (p
nilainya kurang dari2
).Mendefinisikan fungsi
a
yang mengambil posisi awalc
dan kembali hasil bergerak di{1,0}
,{-1,0}
,{0,1}
, dan{0,-1}
arah. Mungkin ada redundansi. Sekali lagi, ini diasumsikanc
sesuai dengan es atau tanah.Menentukan daftar
e
tepi terarah yang mewakili langkah hukum. Untuk setiap posisi#
dalamg
, hitung tabel tepi#->c
untuk setiapc
ina@#
. Kemudian karena kita akan berakhir dengan sublist untuk setiap posisi#
, saya meratakan tingkat pertama. Mungkin ada beberapa loop dan banyak sisi.Graph[e]
adalah grafik di mana simpul adalah posisi hukum (es atau tanah) dan ujungnya mewakili gerakan hukum (mungkin menabrak batu dan tidak bergerak). Kami kemudian gunakanFindPath
untuk menemukan jalur dari#2
untuk#3
diwakili sebagai daftar node. KarenaFindPath
dapat mengambil argumen tambahan untuk menemukan lebih dari satu jalur, hasilnya akan benar-benar menjadi daftar yang berisi jalur tunggal, jadi saya mengambil elemen pertama menggunakan[[1]]
. Lalu saya mengambil berturut-turutDifferences
koordinat danNormalize
mereka. Jadi ke atas{-1,0}
, ke bawah, ke{1,0}
kanan{0,1}
dan ke kiri{0,-1}
.Uji kasus
sumber
JavaScript (ES6) 180
183Menggunakan BFS , seperti yang saya lakukan untuk mengatasi tantangan terkait ini
Input
Peta labirin adalah string multiline, menggunakan
O
atau0
untuk batu,8
untuk tanah dan setiap angka bukan nol kurang dari 8 untuk es (7
terlihat bagus).Posisi awal dan akhir berbasis nol.
Output
Daftar offset, di mana -1 adalah
W
, 1 adalahE
, negatif kurang dari -1 adalahN
dan positif lebih besar dari 1 adalahS
Kurang golf
Uji
sumber