pengantar
Satu keluarga anjing laut terdampar di atas gunung es di Lingkaran Arktik. Ada pemancar radio yang terletak di gunung es yang bisa digunakan anjing laut untuk meminta bantuan. Namun, hanya segel ayah yang tahu cara mengoperasikan pemancar radio. Dan lebih buruk lagi, es sangat licin sepanjang tahun ini, sehingga segel akan meluncur tak terkendali sampai mereka mengenai segel lain atau meluncur dari tepi gunung es, sehingga sangat sulit bagi segel ayah untuk mencapai pemancar radio. Untungnya, salah satu segel adalah ilmuwan komputer, jadi dia memutuskan untuk menulis sebuah program untuk mencari tahu bagaimana cara mengarahkan segel ayah ke pemancar radio. Karena tidak ada banyak ruang di es untuk menulis sebuah program, ia memutuskan untuk membuat program menggunakan byte sesedikit mungkin.
Deskripsi Input
Program segel akan menerima input dari STDIN, argumen baris perintah, atau fungsi input pengguna (seperti raw_input()
). Itu tidak dapat diinisialisasi dalam suatu variabel (mis. "Program ini mengharapkan input dalam suatu variabel x
").
Baris pertama input terdiri dari dua bilangan bulat yang dipisahkan koma dalam formulir
A,B
Mengikuti itu adalah B
garis yang terdiri dari A
karakter masing-masing. Setiap baris hanya dapat berisi karakter dari yang berikut:
.
: Lautan yang dingin, dingin. Peta akan selalu memiliki ini sebagai perbatasan.#
: Bagian dari gunung es.a
...z
: Segel yang bukan segel ayah di gunung es.D
: Segel ayah di gunung es.*
: Pemancar radio.
(Perhatikan bahwa segel ayah selalu dinotasikan dengan huruf besar D
. Huruf kecil d
hanyalah segel biasa.)
Deskripsi Output
Menurut aturan berikut mengenai bagaimana anjing laut dapat bergerak, berikan daftar instruksi untuk anjing laut tentang bagaimana mereka harus pindah untuk mendapatkan segel ayah ke pemancar radio.
- Aturan: Semua segel dapat bergerak ke atas (
U
), ke bawah (D
), ke kiri (L
), dan ke kanan (R
). Mereka tidak bisa meluncur secara diagonal. - Aturan: Saat bergerak, anjing laut akan terus bergerak ke arah yang sama sampai bertabrakan dengan anjing laut lain atau jatuh ke laut.
- Jika segel bertabrakan dengan segel lain, itu akan berhenti bergerak. Segel yang bertabrakan dengannya tidak akan bergerak.
- Jika segel jatuh ke laut, itu akan tenggelam dan menghilang dari peta. Artinya, itu tidak bertindak sebagai collider untuk segel lainnya dan tidak bisa dipindahkan lagi.
- Aturan: Dua segel tidak bisa bergerak pada saat yang sama, segel juga tidak bisa dipindahkan sementara yang lain masih bergerak. Segel berikutnya hanya dapat dipindahkan setelah segel sebelumnya berhenti bergerak.
- Aturan: Tidak ada batasan untuk memindahkan segel beberapa kali, atau jumlah segel yang tenggelam.
- Aturan: Solusi yang benar akan memiliki segel ayah berakhir di pemancar radio. Segel ayah tidak bisa begitu saja melewati pemancar saat meluncur.
Output akan terdiri dari beberapa baris, masing-masing dalam bentuk
A,B
Di mana A
adalah segel untuk memindahkan ( D
untuk segel daddy, a
... z
bagi orang lain), dan B
adalah arah untuk memindahkan segel (baik U
, D
, L
, atau R
). Perhatikan bahwa Anda tidak perlu menemukan rute terpendek. Rute apa pun yang membawa segel ayah ke tujuan adalah hasil yang dapat diterima.
Contoh Input dan Output
Memasukkan:
25,5
.........................
.#######################.
.####D#############*k###.
.#######################.
.........................
Keluaran:
D,R
Memasukkan:
9,7
.........
.a#####b.
.#####d#.
.##l*###.
.###m#p#.
.#D#.#c#.
.........
Output (satu kemungkinan output dari banyak):
m,R
b,L
D,U
D,R
D,D
D,L
Memasukkan:
26,5
..........................
.###..................###.
.l*##########v#########D#.
.###..................###.
..........................
Output (satu kemungkinan output dari banyak):
v,D
D,L
Jika Anda memiliki pertanyaan lain, silakan tanyakan di komentar.
Jawaban:
Python 3, 520 byte
Saya dapat melakukan penjelasan yang lebih terperinci nanti jika orang menginginkannya, tetapi pada dasarnya ini menjalankan pencarian mendalam-pertama dengan memperdalam berulang-ulang pada ruang keadaan kemungkinan pergerakan. Jika pindah menyebabkan segel ayah jatuh, itu segera ditolak. Jika ayah berakhir di sebelah pemancar, urutan gerakan dicetak, dan program dibagi dengan nol untuk memaksa keluar.
Saya dapat membuat kode berjalan lebih cepat secara signifikan dengan menambahkan
if G!=g:
di awal baris kedua-terakhir, untuk 8 byte tambahan - ini menolak gerakan yang tidak mengubah apa pun, sepertik,L
dalam kasus uji pertama.Runtime bervariasi bervariasi dari satu run ke yang berikutnya, bahkan dengan input yang sama - jelas merupakan hasil dari fakta bahwa saya memilih segel berikutnya untuk bergerak dengan mengulangi lebih dari satu
set
, yang merupakan tipe unordered. Saya menghitung waktu test case kedua pada 5 menit 30 detik, meskipun sepertinya tidak begitu lama pertama kali saya menjalankannya. Dengan optimasi yang disebutkan di atas, ini lebih seperti 40 detik.sumber
JavaScript (ES6) 322
334 323Edit2 Menambahkan animasi di cuplikan
Edit perbaikan Bug, ingat posisi awal '*', jadi saya menemukannya bahkan ketika segel meluncur di atasnya dan menghapusnya.
Diimplementasikan sebagai fungsi dengan string input sebagai parameter (mungkin tidak valid tetapi menunggu klarifikasi). Keluaran melalui popup.
Masalah dengan input string multiline dalam JavaScript adalah bahwa
prompt
tidak mengelolanya dengan baik.Adapun algoritma: BFS, harus menemukan solusi optimal. Saya menyimpan antrian status permainan dalam variabel
l
, status di atas kisi karakterg
dan urutan gerakan sejauh inis
. Selain itu, ada satu set kisi yang diperoleh sejauh ini dalam variabelk
, untuk menghindari menjelajahi kisi yang sama berulang kali.Loop utama adalah
Jalankan Cuplikan untuk menguji di FireFox
Tampilkan cuplikan kode
sumber
C ++, 628 byte
Ya, ini tidak terlalu pendek:
Saya memilih C ++ karena saya ingin menggunakan struktur data (
set
,string
), tetapi pada dasarnya cukup bertele-tele. Solusinya tidak cukup baik pada kinerja, menyelesaikan tes 2 dalam lebih dari 2 detik pada MacBook Pro, meskipun tidak dioptimalkan untuk runtime.Kode sebelum mulai menghilangkan spasi putih dan beberapa pengurangan panjang lainnya:
Gagasan inti di balik algoritma ini adalah bahwa dua set dipertahankan:
q
adalah serangkaian konfigurasi yang sedang diproses pemrosesan.p
adalah sekumpulan konfigurasi yang telah diproses.Algoritme dimulai dengan konfigurasi awal pada
q
. Di setiap langkah, konfigurasi muncul dariq
, ditambahkan kep
, semua gerakan segel yang mungkin dihasilkan, dan konfigurasi baru yang dihasilkan dimasukkan ke dalamq
.Uji coba:
sumber
q
tentu akan lebih baik dalam arti itu. Alasan saya menggunakan set adalah karena saya ingin menghindari memasukkan entri yang sama beberapa kali. Tapi saya mulai berpikir dua kali setelah melihat hasilnya.