Buat ular mengisi labirin apa saja (sampai macet).
Ular
Ular mulai pada titik awal yang diberikan, menunjuk EAST . Bergerak dengan selalu memiliki dinding atau bagian dari tubuhnya segera ke KIRI kepalanya (" pengikut aturan dinding kiri "), sampai macet karena keempat arah di sekitar kepalanya ditempati. (Catatan: ular yang macet mungkin tidak dapat mengisi semua ruang yang bisa dijangkau, tapi itu bukan tujuannya!)
Tantangan
Tulis program atau fungsi yang menerima labirin sebagai input dalam bentuk teks 2D:
- Input dapat dalam format apa pun yang masuk akal: misalnya daftar string, string tunggal dengan baris baru, file.
- Labirin memiliki dinding ("
#
"), ruang kosong ("") dan tepat satu titik awal ("
o
"). Anda dapat memilih untuk
- bisa berasumsi bahwa baris dan kolom pertama dan terakhir seluruhnya adalah tembok;
- atau berasumsi bahwa setiap input dianggap memiliki lapisan luar dinding implisit
Anda dapat mengasumsikan bahwa titik awal memiliki dinding (atau dinding implisit) langsung di atasnya (UTARA) dan bahwa ular dapat membuat langkah awal yang valid dalam arah TIMUR atau SELATAN.
- Anda dapat mengasumsikan bahwa tidak ada karakter lain yang ada dalam teks (kecuali baris baru jika input Anda membutuhkannya).
- Anda dapat mengasumsikan bahwa semua garis memiliki panjang yang sama.
dan mencetak / mengembalikan "labirin terisi" sebagai output, dengan snapshot ular saat macet :
- Tubuh ular diwakili oleh karakter yang
>v<^
menunjukkan di mana segmen berikutnya - Titik awal ular adalah arahnya di awal ("
>
" kecuali jika harus segera berbalik) atauo
karakter (tidak perlu konsisten) - Titik akhir dari ular adalah sebuah
o
karakter
Mencetak gol
Golf kode biasa: kode terpendek menang
Contoh
in:
#################################
# o #
# #
# ## ### ## #
# ## ## ## ## #
# ## ## ## ## #
# ## ## ## ## #
# ## ## ## ## #
# ## ### ## #
# ## ##### ## #
# ## ##### ## #
# ## ### ## #
# ## ## #
# #
# #
#################################
out:
#################################
#>>>>>>>>>>>>>>>>>>>v>>>>>>>>>>v#
#^>>>>>>>>>>>>>>>>>v>>>>>>>>>>vv#
#^^ ##>>>>>>v###o>>>>>v## vv#
#^^ ##>^ ##>>>>^## >v## vv#
#^^ ##^ ## ## v## vv#
#^^ ##^ ## ## v## vv#
#^^ ##>^ ## ## >v## vv#
#^^ ##^< ### v<## vv#
#^^ ##^ ##### v## vv#
#^^ ##^ ##### v## vv#
#^^ ##^< ### v<## vv#
#^^ ##^<<<<<<<<<<<<<<<<## vv#
#^^<<<<<<<<<<<<<<<<<<<<<<<<<<<<v#
#^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#
#################################
Animasi (untuk tujuan ilustrasi):
Sunting: perhatikan bahwa, jika ragu, ular itu harus "menjaga tangan kirinya" di dinding yang sudah ada, mengikuti sudut, tidak melompat ke dinding 1-blok jauhnya.
Terima kasih Jonathan Allan untuk membawanya, dan Draco18 untuk snapshot penjelasan di atas.
Contoh lainnya
in:
####################
# o# #
# ###
# #
# ## #
# ###
####################
out:
####################
#>>>>>>>>>>>>>>vv# #
#^>>>>>>>>>>>>vvv###
#^^ v<<<o<<<<v>>v#
#^^<<<<##^<<<<<<v<<#
#^<<<<<<<<<<<<<<<###
####################
in:
####################
# o #####
# #####
# #
# ##
####################
out:
####################
# >>>>v#####
# v#####
# >>>>o#
# ##
####################
in:
################
#o #
# ########## #
# # # #
# # # #
# # # #
# # # # #
# # # #
# # # #
# # # #
# ############ #
# #
################
out:
################
#>>>>>>>>>>>>>v#
#>>v##########v#
#^#>>>>>>>>>v#v#
#^#>>>>>>>>vv#v#
#^#^>>>>>>vvv#v#
#^#^^# vvv#v#
#^#^^o<<<<<vv#v#
#^#^^<<<<<<<v#v#
#^#^<<<<<<<<<#v#
#^############v#
#^<<<<<<<<<<<<<#
################
Jawaban:
Arang ,
9468 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Masukkan input ke dalam string. Ini bisa dihindari dengan menggunakan format input yang kurang nyaman.
Cetak input tanpa menggerakkan kursor, lalu cetak
o
lagi, sehingga kursor berakhir di bawahnya.Inisialisasi arah saat ini.
Ulangi sementara masih ada ruang kosong di beberapa arah.
Hitung apakah ular dapat berbelok ke kiri, atau apakah terpaksa berbelok ke kanan. Kode ini
≦⊖θW¬⁼§KVθ ≦⊕θ
juga berfungsi untuk ini untuk jumlah byte yang sama meskipun dianggap0
sebagai alih-alih benar sehingga sisa kode perlu disesuaikan.Keluarkan karakter tubuh yang sesuai ke arah yang sesuai.
Kembalikan kepala. Ini juga dapat ditulis sebagai
Po
yang mencetak kepala tanpa menggerakkan kursor setiap melewati loop sebagai gantinya (tetapi ini memungkinkan loop untuk secara implisit ditutup untuk jumlah byte yang sama).sumber
Python 2 ,
273253242 byte-11 byte terima kasih kepada ArBo
Cobalah online!
Ini bekerja dengan mencari string
'o '
, dan menggantinya dengan'[>v<^]o'
, jika ada di labirin.Pemeriksaan yang sama juga akan dilakukan pada labirin yang diputar, mencetak labirin yang terisi ketika string tidak ada lagi.
Fungsi
t=lambda g,k=1:'\n'.join(map(j,zip(*g.split('\n')[::k])[::-k]))
ini digunakan untuk memutar gridsumber
Jelly ,
7256 byteCobalah online!
Program lengkap yang mengambil input sebagai daftar string dan mengembalikan daftar string dengan ular terakhir. Catatan footer pada TIO mengubah string yang dipisahkan baris baru tunggal ke input yang diinginkan dan mengembalikan baris baru di akhir; ini hanya untuk kenyamanan.
Solusi agak diilhami oleh metode yang digunakan oleh @ Rod's Python 2 jawaban , meskipun implementasi sangat berbeda.
sumber
Ruby ,
126118 byte-8 byte disimpan dengan menyalahgunakan
+=
alih-alih mencari secara manualo
lagi setelah memposisikan ulang.Cobalah online!
sumber
Permintaan T-SQL 2008,
373371366 byteSaya memiliki daftar prioritas, selalu meluncur ke kiri, lurus, kanan. Saya mengubah prioritas itu untuk selalu meluncur ke belakang, kiri, lurus, kanan. Slithering back akan selalu diblokir, jadi prioritasnya tetap sama kecuali slither pertama. Dengan membalikkan ular pada awalnya (C = 4), ia mencoba merayap naik saat backslithering. Aksi kecil ini menyelamatkan saya 2 byte. Karena saya tidak perlu menambahkan 1 ke ~ - ~ -c% 4.
Saya memasukkan 2 jeda baris agar bisa dibaca
Saya harus membuat beberapa penyesuaian kecil untuk menjalankan ini secara online, versi yang diposting berjalan di studio manajemen server MS-SQL.
Tekan Ctrl-T sebelum dijalankan di studio manajemen server MS-SQL, ini akan menampilkan hasil sebagai teks.
Cobalah online
sumber
Python 3 , 343 byte
Cobalah online!
-11 byte terima kasih kepada ArBo
-4 byte terima kasih kepada Jonathan Frech
sumber
X
,Y
danF
untukX=0,1,0,-1;F,*Y=*X,0
jika saya tidak salah. Juga,import*
biaya byte Anda lebih banyak daripada menghemat.*g,=map(...)
. Dan apakahsys.stdin.readlines()
mungkin berhasil?input()
.if C=="o"
~>if"o"==C
,if g[r+X[L]][c+Y[L]]==" "
,elif g[r+X[F]][c+Y[F]]>" "
,if g[r-X[L]][c-Y[L]]>" "
Sesuai.05AB1E ,
5452 byteI / O keduanya sebagai string multi-line tunggal.
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber
Pyth , 161 byte
Cobalah online!
Port solusi HyperNeutrino Python 3 . Sekarang saya sudah selesai dengan itu, saya berpikir mungkin saya seharusnya mem-porting solusi Rod's Python 2 sebagai gantinya, tapi saya sudah menghabiskan terlalu banyak waktu untuk ini.
sumber