Anda adalah Ruby, seorang insinyur kereta api. Tugas Anda adalah untuk meletakkan trek di lembah tertentu sehingga mengunjungi setiap stasiun ( M
). Jumlah lintasan yang diletakkan tidak penting, tetapi harus diletakkan di satu lintasan kontinu yang dimulai dan berakhir di titik masuk / keluar lembah ( >
) dan tidak, pada titik mana pun melintas sendiri. Ada beberapa kendala lain: gunung ( ^
) tidak bisa dilewati sehingga Anda harus mengitarinya, sungai ( ~
) harus dilintasi menggunakan jembatan ( X
), dan ujung lembah ( #
) juga tidak bisa dilewati.
Aturan Lintasan
Jika trek tidak diletakkan dengan benar akan ada penggelinciran dan tidak ada yang menginginkannya, jadi inilah aturan penempatan trek.
Ada empat jenis lagu: -
|
/
\
.
Inilah cara masing-masing dapat digabungkan dengan yang lain:
Kombinasi yang diizinkan dari -
(di bagian tengah setiap contoh):
##### ##### ##### ##### ##### ##### #####
# # # # #\ # # # # /# #\ /# # #
#---# # --# # --# #-- # #-- # # - # # - #
# # #/ # # # # \# # # # # #/ \#
##### ##### ##### ##### ##### ##### #####
-
mungkin tidak pernah digabungkan dengan |
. Ini adalah tikungan yang terlalu tajam untuk dibuat kereta dengan aman.
Kombinasi yang diizinkan dari /
(di bagian tengah setiap contoh):
##### ##### ##### ##### ##### ##### #####
# /# # -# # |# # /# # /# # -# # |#
# / # # / # # / # # / # # / # # / # # / #
#/ # #/ # #/ # #| # #- # #| # #- #
##### ##### ##### ##### ##### ##### #####
\
mungkin tidak pernah digabungkan dengan /
. Ini adalah tikungan yang terlalu tajam untuk dibuat kereta dengan aman.
Kombinasi yang diizinkan dari \
(di bagian tengah setiap contoh):
##### ##### ##### ##### ##### ##### #####
#\ # #- # #| # #\ # #\ # #- # #| #
# \ # # \ # # \ # # \ # # \ # # \ # # \ #
# \# # \# # \# # |# # -# # |# # -#
##### ##### ##### ##### ##### ##### #####
Kombinasi yang diizinkan dari |
(di bagian tengah setiap contoh):
##### ##### ##### ##### ##### ##### #####
# | # #\ # # /# # | # # | # # /# #\ #
# | # # | # # | # # | # # | # # | # # | #
# | # # | # # | # #/ # # \# # \# #/ #
##### ##### ##### ##### ##### ##### #####
Lintasan dapat digabungkan dengan stasiun, jembatan, dan pintu masuk / keluar lembah dengan cara berikut:
##### ##### #####
#\|/# #\|/# #/ #
#-M-# #-X-# >- #
#/|\# #/|\# #\ #
##### ##### #####
Stasiun memiliki turn-tables, sehingga diperbolehkan untuk meninggalkan stasiun pada sudut yang tajam (meskipun tidak mendukung cara Anda datang - Anda tidak ingin menabrak kereta yang dijadwalkan berikutnya datang dengan cara lain!).
Jembatan adalah untuk menyeberangi sungai sehingga Anda harus keluar dari jembatan di seberang sungai yang Anda masuki.
Memasukkan
Input akan melalui STDIN untuk program atau argumen fungsi untuk fungsi. Jika fungsi Anda membutuhkan nama agar saya dapat menjalankannya pada input saya maka deklarasi nama itu harus dimasukkan dalam jumlah byte.
Input akan berupa string tunggal dengan jeda baris. Setiap baris dalam input Anda akan selalu sama panjangnya dengan yang lain, memberi Anda input persegi panjang. Tepi input akan selalu padat dan tidak dapat dilewati ( #
) kecuali untuk titik masuk. Setiap input yang diberikan akan memiliki setidaknya satu jawaban yang valid.
Keluaran
Output Anda harus dikembalikan sebagai string tunggal dengan jeda baris dari suatu fungsi, atau dicetak / digema ke layar untuk program penuh.
Outputnya harus sama dengan input tetapi dengan karakter trek ditambahkan.
Mencetak gol
Pemenang akan menjadi kode terpendek dalam byte.
Uji kasus
###########
# M #
# ^ #
> ^^ M #
# ^ #
#~~~~~~~~~#
# M #
# ^^ #
# M#
###########
#################
# #
# M M #
# ^ #
# ^ M #
#~~~~~~~^ #
# #
# ^ #
# M^ #
# ^ #
> ^^^ M#
# #
# M #
#################
###############
# M ~ #
# ~ #
> ~ M #
# ~ #
# ~ #
# ~ #
###############
Kemungkinan solusi untuk menguji kasus
###########
# ---M #
#/ ^ \ #
> ^^ M #
#\ ^ | #
#~X~~~~X~~#
# M \ #
# \ ^^ |#
# -----M#
###########
#################
# #
# M---------M #
# | ^ / #
# / ^ M- #
#~X~~~~~^ | #
# | \ #
# \^ \ #
# --M^ \ #
#/ ^ |#
> ^^^ M#
#\ / #
# -------M---- #
#################
###############
# M ~ #
#/ \ ~ #
> --X----M #
#\ ~ | #
# \ ~ / #
# ---X--- #
###############
Jawaban:
Python 2 ,
3990343044124313 byteIni pada dasarnya adalah A * dengan heuristik jelek dan
getChildren
metode jelek . Untuk menjalankan 3 test case secara berurutan mengambil6.5s
mesin saya. Fungsif
adalah solusinya di sini. Dibutuhkan peta sebagai string dan mengembalikan peta yang diselesaikan sebagai string.Cobalah online!
Uji Kasus
Tes 1
Tes 2
Tes 3
Kode sumber
A * Negara + A * Kelas Solver
Saya benar-benar bermain golf ini dari solusi saya. Tetapi mereka ada dalam versi 'terbaca' saya . Kelas Negara bersifat generik dan dimaksudkan untuk diterapkan. Kelas Solver mengambil status awal dan kemudian mengikuti status heuristik
getDist
.Kelas Negara
Ini adalah implementasi dari kelas A * state. Metode yang paling penting di sini adalah
getDist
, heuristik untuk menentukan seberapa dekatself
tujuan. Ini pada dasarnya adalah jarak minimum untuk mengunjungi semua tujuan yang tersisa dan kembali untuk memulai.Kelas Peta
Kelas ini menyimpan dan memproses peta. The
isConnected
metode adalah mungkin yang paling bagian penting. Ini menguji untuk melihat apakah 2 buah trek terhubung.Pembaruan
;
ssumber
elif e!=""and e in"MX>"
dapat digabungkan menjadi satu garis dengan ternerif else
. Juga, beberapa dari Andadef
mungkinlambda
s. Sepertidef A(s):return str(s)
bisaA=lambda s:str(s)
, atau jika Anda mengubah dari__str__
ke__repr__
, Anda dapat menggunakanA=lambda s:`s`
, pada titik itu, bahkan tidak layak memilikiA
fungsinya sendiri, karena memerlukan tanda kurung untuk memanggil. Cukup gunakan backticks sebagai gantinya.