Anda berada di stasiun ruang angkasa intergalaksi canggih. Seorang teman Anda yang sedang belajar di Gravitasi Studi baru saja menciptakan sebuah permainan yang melibatkan menggunakan gayaberat mikro sebagai cara untuk memindahkan bola di sekitar.
Dia memberi Anda controller kecil dengan empat panah arah di atasnya dan struktur seperti labirin dengan bola duduk di sebelah kiri. Dia mulai menjelaskan cara kerja gim.
- Anda memiliki 2 tombol arah, kiri
<
dan kanan>
. - Anda juga memiliki 2 tombol gravitasi, naik
^
dan turunv
(setidaknya dari kerangka referensi Anda) - Anda akan menggunakan tombol panah ini untuk menggerakkan bola di layar Anda.
"Sekarang ada beberapa aturan yang perlu diikuti." dia berkata
- Semua platform harus dilalui sebelum sampai ke piala
\ /
- Panah
< > ^ v
akan digunakan untuk menentukan pergerakan bola - Gravitasi adalah
^ v
(naik & turun). Ini menggerakkan bola sampai ke platform berikutnya ke arah itu. (Jarak tidak dihitung untuk naik turun) - Kehilangan bola itu buruk! Jangan jatuh ke tepian, dan jangan beralih gravitasi terlalu cepat sehingga bola Anda tidak pernah mencapai platform
- Gerakan dihitung dalam langkah-langkah
< >
- Bola dapat memasuki cawan dari arah mana pun selama Aturan 1 diikuti
- Anda harus menentukan arah gravitasi agar bola Anda tidak melayang
- Gerakan mungkin acak selama Aturan 1 dan Aturan 4 diikuti
- Untuk kasus yang tidak dapat diselesaikan, output False atau Invalid
Contoh sederhana bola, platform, dan piala:
v
o
---\ /
v>
o
---\ /
v>>
o
---\ /
v>>>
o
---\ /
v>>>>
---\o/
Contoh melintasi lagi di platform yang sama.
v
o
----
\ /-------
v>
o
----
\ /-------
v>>
o
----
\ /-------
v>>>
o
----
\ /-------
v>>>>
----
o
\ /-------
v>>>>>
----
o
\ /-------
v>>>>>>
----
o
\ /-------
v>>>>>>>
----
o
\ /-------
v>>>>>>>>
----
o
\ /-------
v>>>>>>>><<<<<<<< # move all the way to the left to get to the cup
----
\o/-------
Contoh beralih gravitasi
v
--/ \
o
----
v>
--/ \
o
----
v>>
--/ \
o
----
v>>>
--/ \
o
----
v>>>^
--/ \
o
----
v>>>^>
--/ \
o
----
v>>>^>>
--/ \
o
----
v>>>^>>>
--/o\
----
Tugas
Tugas Anda adalah membuat program yang akan mengambil representasi ASCII dari kursus sebagai input. Dan menghasilkan serangkaian panah yang <>^v
mewakili arah dan tarikan gravitasi untuk memindahkan bola o
melintasi semua platforms
ke dalam cangkir.
Aturan golf kode standar berlaku
Uji Kasus
Input (Situasi di mana gravitasi sedang diaktifkan)
---- --/ \
--- --
o
------ -----
Keluaran
^>>v>>>>>^>>>>>v>>>>^>>>
Input (Situasi di mana arah dialihkan)
---
o
----
---
-----
--\ /
Keluaran
v>>>>>>^>>>v<<<<<v>>>
Input (Situasi di mana Anda harus melintasi platform yang sama dua kali)
o
------
------
------
\ /------
Keluaran
v>>>>>><<<<<<>>>>>>><<<<<<
Kasus Buruk, Program harus menampilkan Falsy untuk ini
Tidak mungkin bola bisa sampai ke platform berikutnya
o
--- ---
Bola akan melayang ke angkasa
---
o
---
Situasi di mana bola sampai ke piala, tetapi semua platform tidak dilewati.
o
----
----
\ /----
sumber
Jawaban:
Pyth, 431 byte
Ini adalah program Pyth pertama saya (sebenarnya ini adalah program pertama saya dalam bahasa kode-golf), yang artinya mungkin masih dapat ditingkatkan.
Coba di sini (testcase terakhir terlalu lama, harus diuji dengan instalasi Pyth lokal).
Hex dump kode (gunakan
xxd -r <filename>
untuk memecahkan kode):Penjelasan
Gagasan utama untuk program ini adalah menggunakan ekspresi reguler untuk memodifikasi input. Untuk menghemat ruang, semua ekspresi reguler ini terkandung dalam string terkompresi. Langkah pertama dalam program ini adalah mendekompresi string dan membaginya menjadi ekspresi reguler tunggal dan string pengganti yang sesuai.
Isi variabel
J
adalah:Fungsi ini
r
menerapkan penggantian regex dari daftar yang disimpan diJ
dalam indeksG
ke semua string dalam daftarH
. Ini kembali segera setelah salah satu string diubah.Fungsi
i
ini mirip dengan fungsir
dengan 2 perbedaan. Ini menerapkan substitusi pada daftar yang dialihkan (vertikal, bukan horizontal). Itu juga melakukan penggantian berulang kali selama ada yang berubah.Fungsi
g
memeriksa apakah regex dari daftar yang disimpan diJ
dalam indeksG
dapat ditemukan di string mana pun dalam daftarH
.Sisa kode berisi logika program yang sebenarnya. Ini melakukan pencarian luas pertama untuk gerakan yang mungkin sampai solusi ditemukan. Posisi di pohon pencarian secara unik ditentukan oleh arah gravitasi dan salinan input program yang dimodifikasi. Untuk menghindari pemrosesan posisi yang sama berulang-ulang, posisi yang diproses disimpan dalam daftar global
K
. Posisi yang masih harus diproses disimpan bersama dengan bagian yang sesuai dari solusi dalam daftarY
.Modifikasi input dan inisialisasi dari
K
danY
dilakukan oleh kode berikut:Modifikasi input melakukan sesuatu seperti berikut ini. Input:
ditransformasikan menjadi:
Nilai-nilai memiliki arti sebagai berikut:
-
Platform yang harus tetap dikunjungi=
Platform yang tidak perlu dikunjungi lagiM
Piala yang bisa dimasukkan dengan gravitasi diatur ke "turun"W
Piala yang dapat dimasuki dengan gravitasi diatur ke "atas"V
Aman untuk pindah ke tempat ini dengan gravitasi diatur ke "turun"A
Aman untuk pindah ke tempat ini dengan gravitasi diatur ke "atas"X
Aman untuk pindah ke tempat ini terlepas dari pengaturan gravitasi6
Bola di tempat yang akan ditandai sebagaiV
9
Bola di tempat yang akan ditandai sebagaiA
0
Bola di tempat yang akan ditandai sebagaiX
Logikanya menggunakan ekspresi reguler untuk melakukan gerakan. Pada contoh di atas, jika gravitasi diatur ke "atas", kita dapat mengganti "9A" dengan "A9" dengan regex untuk memindahkan bola ke kanan. Ini berarti dengan mencoba menerapkan regex kita dapat menemukan semua gerakan yang mungkin.
Fungsi
X
melakukan gerakan bola vertikal berdasarkan pengaturan gravitasi saat ini, menyimpan hasilnya dalam daftar globalK
danY
, dan memeriksa apakah solusi ditemukan.Fungsi
(
mengimplementasikan pemeriksaan untuk 4 arah / gravitasi tombol. Tombol gravitasi dapat ditekan hanya jika gravitasi saat ini akan berubah dan jika bola berada di tempat yang aman untuk mengubah gravitasi. Tombol arah dapat ditekan hanya jika aman untuk pindah ke tempat yang sesuai.Akhirnya loop utama. Elemen pertama
Y
dihapus berulang kali, dan memeriksa semua gerakan yang mungkin dilakukan.sumber
Y
daftar akan kosong, pop akan menampilkan kesalahan dan#
loop akan berakhir.