Beberapa suka-suka-nakal berbasis teks tidak membiarkan Anda masuk ke dinding, dan memberi Anda langkah mundur jika Anda mencobanya. Mengapa melakukan itu ketika Anda bisa membuat pemain bergerak ke arah yang sah terdekat?
Tantangan
Tulis program fungsi yang, diberi arah dan kisi karakter 3 oleh 3, menampilkan kisi yang sama setelah pemain mengambil langkah.
Sebagai contoh,
9
#..
.@#
#.#
menjadi
#.@
..#
#.#
Memasukkan
Arah diberikan oleh satu digit dari 1 hingga 9, masing-masing sesuai dengan 8 arah mata angin dan diam. Ini berasal dari lokasi relatif angka pada keypad:
NW N NE .. \ | / ... 7 8 9 W- 4 5 6 -E ... 1 2 3 ../ | \ SW S SE
Namun, Anda juga dapat menggunakan angka 123, 456, 789 alih-alih 789, 456, 123. Dengan kata lain, Anda dapat menukar 2 baris atau angka atas dan bawah jika Anda memilihnya. Ini adalah satu-satunya 2 kombinasi indeks yang dapat diterima.Kisi-kisi 3 oleh 3 akan terdiri dari 3 karakter ASCII yang dapat dicetak yang mewakili lantai, dinding, dan pemain yang dapat dilewati. (Dalam kasus uji,
.
digunakan untuk lantai,#
dinding, dan@
pemain)- Anda dapat memilih karakter apa yang digunakan oleh program Anda, tetapi Anda harus menyatakannya dalam jawaban Anda dan karakter itu harus konsisten dalam berbagai uji coba.
- Karakter yang mewakili karakter akan selalu berada di tengah kotak 3 dengan 3, dan arahnya akan selalu antara 1 dan 9 (termasuk)
- Anda dapat menerima input dalam urutan apa pun
- Kisi 3 oleh 3 dapat dimasukkan sebagai array char, array string, string 9 panjang, atau alternatif lain yang masuk akal.
Keluaran
- Kembali dari fungsi, atau output ke StdOut atau alternatif terdekat
- Ruang tambahan dan baris baru diizinkan
- Anda harus menggunakan representasi karakter yang sama sebagai input
- Format yang sama diizinkan untuk input diizinkan untuk output
Bagaimana pemain bergerak
Jika arah yang ditentukan diblokir oleh dinding (misalnya jika contoh di atas memiliki arah 6), maka lihatlah 2 arah terdekat:
- Jika satu (dan hanya satu) arah gratis, gerakkan pemain ke arah itu.
- Jika tidak ada arah yang gratis, lihat 2 arah terdekat berikutnya (tidak termasuk arah 5). Jika Anda telah membungkus sepanjang jalan dan tidak menemukan arah terbuka (pemain dikelilingi oleh dinding), jangan gerakkan pemain
- Jika kedua arah terbuka, pilih satu untuk dipindahkan secara acak (meskipun tidak harus seragam).
Jika arah yang diberikan adalah 5, jangan gerakkan pemain
Uji kasus
( #
= dinding, .
= lantai, @
= pemain)
Memasukkan: 9 # .. . @ # #. # Keluaran: #. @ .. # #. # Memasukkan: 3 # .. . @ # #. # Keluaran: # .. .. # # @ # Memasukkan: 7 ##. # @ # .. # Keluaran: ## @ ##. #.# atau #.# .. # @. # Memasukkan: 5 ... . @. ... Keluaran: ... . @. ... Memasukkan: 2 ### # @ # ### Keluaran: ### # @ # ###
Mencetak gol
Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
yuhjklbn
? MENINGGAL DUNIA.123;456;789
bukan789;456;123
?Jawaban:
Pyth -
7370 byteCobalah
Input terdiri dari dua baris:
Baris 1: arah bergerak
Baris 2: Papan (posisi 123456789, dengan 123 sebagai baris teratas)
sumber
JavaScript (ES6),
192163 byteCatatan
Fungsi ini menggunakan format input khusus. Input pertama adalah array bilangan bulat (
0
untukfloor
,1
untukwall
dan2
untukplayer
) yang mewakili peta. Input kedua adalah arah (terbalik):1
adalah barat laut,2
utara,3
timur laut,4
barat dll. Masukan harus diberikan melalui sintaks currying (Z(a)(b)
).Uji kasus
Peta dan arah telah dimodifikasi agar sesuai dengan format input saya.
sumber
Python 3,
120104153176175 byteCobalah online!
Metode ini mendapatkan arahan dan daftar '.', '#' Dan '@'. Indeks dimulai dengan 1 hingga 9 (dengan 0 hingga 8 dalam daftar sebenarnya). Jadi ada bentuknya
Metode mengembalikan daftar baru dengan posisi baru.
Garis ini
mengembalikan daftar jenis ini:
Kami menghitung jarak ke poin gratis dan menambahkan keacakan. Karena
ord('#') <= ord('.') - 8 and ord('.') + 8 <= ord('@')
kita dapat mengatakan itu terdekat '.' untuk n = 7 (indeks dalam daftar) memiliki indeks 8.Contoh:
sumber
','
(yang merupakan kasus untuk kasus uji 2, 3 dan 5). 2) Format I / O Anda sepertinya tidak sama dengan yang ada di pertanyaan. Harap sebutkan format I / O Anda.f(9, ...
Anda tidak berfungsi - ia menempatkan karakter pada 2 tetapi posisi terdekat ke 9 adalah 6 dan 8, jadi salah satu dari itu harus dipilih secara acak (tidak ada keacakan dalam kode Anda juga). Selanjutnya ia harus pergi berkeliling perimeter menemukan terdekat berikutnya, sehinggaf(9,list("####@#.##"))
harus menempatkan karakter ke satu-satunya tempat yang mungkin (7 di sini).f(9, ...
harus kembalilist("#....##@#")
(karena 8 gratis dan di sebelah 9). 2. Sesuatu sepertif(9,list("####@.#.#"))
harus memiliki beberapa kesempatan untuk kembalilist("####..#@#")
(tidak selalulist("####.@#.#")
) seperti yang ditentukan "Jika kedua arah terbuka, pilih satu untuk pindah secara acak".