Hidup Anda bisa bergantung pada ini. Jangan berkedip. Jangan berkedip. Berkedip dan Anda mati. Mereka cepat. Lebih cepat dari yang Anda bisa percaya. Jangan berbalik, jangan memalingkan muka, dan jangan berkedip! Semoga berhasil.
Menangis Malaikat adalah ras alien yang tidak bisa bergerak sambil diamati oleh makhluk lain (bahkan Malaikat lain). Mereka memberi makan dengan mengirim para korban mereka kembali ke masa lalu. Anda ( Dokter ) terperangkap di sebuah ruangan bersama beberapa orang, dan Anda perlu mendatangi TARDIS Anda.
Tugas
Tulis sebuah program yang akan, diberi representasi ASCII dari ruang persegi panjang, menghasilkan jalur yang akan membawa Anda ke tempat yang aman. Jika ada Malaikat yang dapat menyerang - kapan saja selama kemajuan Anda - maka jalan itu tidak aman. Malaikat dapat menyerang jika ia dapat melihat Anda sementara tidak terlihat oleh Anda atau Malaikat lain.
Memasukkan
Input adalah dua bagian. Pertama, arah yang Anda hadapi (NSEW). Kemudian pada baris berikutnya, representasi ruangan, menunjukkan lokasi awal / akhir, dan lokasi / menghadap semua Malaikat.
Sampel di bawah ini menunjukkan bahwa ada satu malaikat menghadap ke barat, dan Anda mulai menghadap ke selatan.
S
..........
....D.....
..........
..........
..........
..........
..........
..........
.........W
..........
...T......
.
- Ruang kosongD
- Dokter (posisi awal)T
- TARDIS (posisi akhir)N,S,E,W
- Seorang Malaikat, menghadap ke arah yang ditentukan (utara, selatan, timur, barat)
Pandangan
Anda dapat melihat ruang apa pun dengan 45 derajat arah yang Anda hadapi. Garis pandang terhalang jika ada entitas lain di sepanjang horisontal, vertikal, atau diagonal 45 derajat langsung. Diagonal lainnya tidak menghalangi pandangan. Garis pandang malaikat bekerja dengan cara yang sama. Misalnya, berikut ini, -
mewakili bidang pandang Anda, dengan asumsi Anda menghadap ke selatan.
........
...D....
..---...
.-----..
-------.
---N----
---.--N-
---.----
Keluaran
Outputnya adalah string yang mewakili jalur yang akan Anda ambil untuk keluar. Jika ada beberapa jalur aman, pilih salah satunya. Jika tidak ada jalur yang aman, hasilkan 0
. Jika peta salah bentuk, lakukan apa pun yang Anda suka, termasuk mogok. Anggap itu cacat jika ruangan itu tidak persegi panjang, tidak ada jalan keluar, dll. Jika tidak ada Malaikat, itu tidak cacat, cukup mudah.
Untuk setiap langkah, Anda dapat melakukan salah satu dari dua hal: bergerak ke arah NSEW, atau beralih ke arah NSEW (tanpa mengubah posisi). Untuk bergerak, cukup keluarkan huruf untuk arah itu. Untuk berbalik menghadap arah, output F
diikuti oleh huruf yang sesuai. Misalnya, output berikut:
SSFESSSSSSSW
adalah jalur aman untuk sampel yang diberikan di bagian input. Anda bergerak ke selatan dua kali, menghadap ke timur untuk menjaga agar malaikat itu tidak terlihat, lalu bergerak ke selatan tujuh kali dan ke barat sekali untuk memasuki TARDIS.
Uji Kasus
1) Kamu bisa berkeliling Malaikat yang menghadap ke timur untuk sampai ke TARDIS. Kecuali Anda melangkah langsung di antara mereka, mereka mengunci satu sama lain di tempat, jadi tidak masalah ke arah mana Anda menghadap pada titik mana pun.
W
...D....
........
........
........
.E.....W
........
........
...T....
2) Anda kalah. Tidak ada cara untuk melewati mereka. Mereka dapat saling bertemu sampai Anda melangkah di antara mereka. Pada saat itu, Anda tidak dapat menghadapi mereka berdua dan selesai. Lebih baik tutup saja matamu dan selesaikan.
S
...D....
........
........
........
E......W
........
........
...T....
Kemenangan
Aturan dan celah golf standar berlaku, paling tidak byte menang. Saya akan mencoba untuk mendapatkan beberapa lagi test case segera, tetapi jangan ragu untuk menyarankan Anda sendiri untuk sementara waktu.
Gambar dan kutipan dari Doctor Who.
J
).Jawaban:
Python -
559 565 644633Input harus disediakan seperti ini:
Pada dasarnya pendekatan ini diterapkan untuk menemukan semua keadaan (posisi dan arah) yang dapat dijangkau oleh Dokter dengan aman, menyimpan bagaimana dia sampai di sana dan mencetak jalan jika berhasil. Posisi dan arahan diwujudkan dengan bilangan kompleks.
Saya mungkin bisa mengamankan beberapa karakter menggunakan aritmatika bilangan kompleks Sage, tetapi itu akan berlangsung sangat lama.
Saya pertama kali berpikir saya bisa menyelamatkan enam karakter dengan membuat Dokter berubah menjadi arah tertentu setelah mencapai Tardis, tetapi saya menyadari bahwa ini dapat menghasilkan solusi yang salah. Saya juga pertama kali salah membaca aturan.
Berikut ini adalah versi yang sebagian besar tidak bercabang:
Uji Kasus
Uji kasus 1:
Uji kasus 2:
Kasus uji VisualMelon:
sumber
C #
17712034196218871347bytesMenulis ulang LOS pemblokiran yang memeriksa dalam 1 loop, membuatnya jauh lebih rapi, dan sekitar 450bytes lebih pendek
Ini adalah program lengkap yang mengharapkan input untuk diakhiri dengan EOF dan diteruskan ke STDIN. Ini (semoga) mencetak jalur terpendek ke TARDIS, atau "0" jika tidak ada jalur. Ia menggunakan Breadth First Search yang jelek untuk mengikuti semua rute yang mungkin, kemudian melakukan backtracks dari TARDIS ke The Doctor untuk mengumpulkan output.
Kode yang diformat:
Keluaran misalnya input
Output untuk test case 1)
Output untuk test case 2)
Saya mempersembahkan, seperti yang diminta, test case baru:
Output program saya
WozzeC's Test Case 1:
WozzeC's Test Case 2:
sumber
C #
1454, 1396, 1373, 13031279Baik. Jadi saya memutuskan untuk mencobanya, dan anak laki-laki itu perlu waktu. Itu dibangun sebagian besar menggunakan operator logis.
Untuk menghindari keharusan memeriksa Null dll. Saya memutuskan untuk menggunakan bidang [MAX_SIZE * 3] * [MAX_SIZE] * 3 dan meletakkan papan permainan dekat dengan pusat.
Pengecekan loop dilakukan di dalam dan luar hingga 50 (MAX_SIZE). Jadi sesuatu seperti ini:
Ketika EWS atau N ditemukan, saya melakukan pemeriksaan yang sama pada bagian mereka. Jika ada yang ditemukan melihat Malaikat (Bukan Dokter) mereka mengembalikan 15 sebagai bagian gratis. Jika tidak diperhatikan, mereka kembali dengan cara apa yang harus dihadapi Dokter agar aman. yaitu N akan mengembalikan 2 untuk selatan. Kecuali jika NW atau NE dalam hal ini akan mengembalikan 6 (2 + 4) dan 10 (2 + 8) masing-masing.
Jika dua malaikat mengawasi Dokter, nilai balik dari ini adalah "ANDed" sehingga dalam contoh uji 2 posisi crunch 4 AND 8 akan berubah menjadi 0. Berarti posisi itu buruk dan harus dihindari.
Kode yang diperluas:
Hasil tes
1 Contoh: FNSSSWNNNWSSWSSSSENENESES
2 Contoh: Tidak ada jalan keluar
Contoh VisualMelon: FNSSSSSSSWNNNNNNWSSSSSSSSSESEEE
Kasus Tes Saya1: FSSENEEEFWSSFNSWWN
Kasus Tes Saya2: FSEEEESFWSSSSFNWWWWNFENNFSEES
Seperti yang bisa dilihat, Dokter saya suka berjalan-jalan seperti douche untuk menunjukkan kepada para malaikat betapa menyenangkannya bergerak. Saya dapat membuat perangkat lunak menemukan jalur terpendek, tetapi membutuhkan waktu lebih lama dan membutuhkan lebih banyak kode.
Uji kasus untuk kalian
Yang lainnya:
sumber
using S=System.Console;
, atau Anda bisa menghapus S semuanya dalam kode Anda dan menyimpan 6 byte denganusing System
. Sekarang saya harus mencoba dan mengurangi pendekatan naif saya lagi ...;)