Tulis sebuah program atau fungsi yang, dengan urutan belokan kanan atau kiri yang tidak kosong , menampilkan panjang jalur penghindaran diri terpendek pada kisi 2D dengan belokan itu.
Input harus diambil sebagai string, dengan masing-masing karakter menjadi R
atau L
untuk belokan kanan atau kiri masing-masing.
Output harus berupa bilangan bulat, panjang jalur terpendek dengan belokan yang diberikan.
Ini adalah golf gode - kode menang paling pendek.
Contoh
Diberikan input
LLLLLLLLLLRRL
Jalur terpendek adalah sebagai berikut (mulai dari #
):
+-+-+-+-+-+-+
| |
+ . + +-+-+ +
| | | | |
+ +-+ + #-+ +
| | | |
+ +-+ +-+-+-+
| |
+-+-+ . . . .
Dan total panjang jalur ini adalah 29
(menghitung -
s dan |
s, bukan +
s).
Uji Kasus
L 2
RRRRRRRRRR 23
LRRLRLRRRRL 15
LLRRLRRRRLLL 17
LLRRRRRRLLLL 21
LLLLRLLRRLLRL 16
LRLRLRLLRLRRL 14
RLLRRRRLLRRLRL 17
RRRRLLRLLLRLRL 20
LLLLRRLRLRRRLRL 19
RRRLRRRLRRLRLRL 20
code-golf
path-finding
kotak kardus
sumber
sumber
Jawaban:
Prolog, 284 byte
Ini adalah pernyataan algoritma yang cukup mudah, dan cukup tidak efisien (tidak semua kasus uji berjalan dalam waktu yang wajar, meskipun sebagian besar melakukannya). Ia bekerja melalui menghasilkan semua panjang yang mungkin untuk output dari 1 ke atas (
n
); menghasilkan semua urutan yang mungkin dari kiri / maju / kanan dengan panjang yang konsisten dengan input (diimplementasikan dalame
; jalur baru disebutX
); kemudian memeriksa jalur pertama yang valid (c
, yang memanggilv
untuk menangani efek belokan kiri dan kanan pada delta x dan y). Panjang kembali adalah output pertama yang terlihat diL
. (+2 penalti jika Anda ingin mencegah fungsi mengembalikan output lain yang mungkin untuk panjang jika Anda mundur ke dalamnya; itu tidak pernah cukup jelas bagaimana pengembalian fungsi istimewa Prolog harus dihitung.)Tidak banyak cara trik golf di sini, tetapi ada beberapa.
n
diimplementasikan dengan pemecah kendala karena memungkinkan lebih banyak ruang kosong untuk dihapus tanpa membingungkan parser; ini mungkin memerlukan GNU Prolog untuk digunakan, tidak yakin tentang itu. (Saya tidak bisa melakukan hal yang samac
karena perlu menangani angka negatif.) Implementasie
ini jauh lebih efisien daripada yang seharusnya, melalui pencocokan daftar dalam berbagai cara; semakin efisiene([],[]).
akan menjadi enam byte lebih lama (itu akan memungkinkanS=X;
jalur 2 dihapus, tetapi itu hanya keuntungan empat dibandingkan dengan kerugian sepuluh). Untuk memungkinkan saya mencocokkan koordinat dan arah secara keseluruhan, atau hanya sebagian, saya mewakili mereka sebagaiX/Y
(yaitu AST yang tidak dievaluasi, yang dapat dicocokkan pada), memungkinkan saya untuk menggunakan notasi infiks.Prolog, 256 byte, terlalu tidak efisien untuk dengan mudah diuji
Tentu saja, karena ini adalah Prolog, banyak fungsi yang dapat dibalik, misalnya
c
dapat digunakan untuk menghasilkan semua jalur dari asal ke pasangan koordinat tertentu. Selain itu,c
secara alami menghasilkan dari terpendek ke terpanjang. Ini berarti bahwa alih-alih meminta panjang minimum secara eksplisit, kita bisac
membuat semua jalur yang menuju ke mana saja , lalu mencari yang pertama yang konsisten dengan input:Ini memiliki kinerja eksponensial (O (3 n ), di mana n adalah output). Namun, saya berhasil memverifikasi pada beberapa tes yang lebih kecil (dibutuhkan sekitar 7 detik untuk output 14, dan sekitar 20 untuk output 15, di komputer saya).
sumber
Pyth , 36 byte
Cobalah online!
Ini cukup lambat, tetapi bekerja, dan cukup cepat untuk input pendek.
Program ini bekerja dengan merepresentasikan arahan sebagai unit kompleks (1, -1, i, -i), dan poin sebagai bilangan kompleks. Pertama-tama saya mengonversi daftar belokan menjadi daftar arah, kemudian menghasilkan semua daftar n langkah, memfilter untuk mereka dengan setidaknya satu langkah di antara setiap belokan, dan mengonversi arah menjadi daftar poin yang dikunjungi, dan memeriksa apakah daftar itu adalah unik. Saya menambah n dalam satu lingkaran sampai saya berhasil.
Peta ke bilangan kompleks:
Karena
L
memiliki ASCII codepoint 76 danR
memiliki ASCII codepoint 82, ini memetakanL
kei
danR
ke-i
.Peta ke arah absolut:
Bentuk daftar n langkah dengan setidaknya 1 langkah antara setiap belokan
Seharusnya ada satu gerakan lebih banyak daripada yang ada pada input. Setiap gerakan berada dalam arah yang berbeda, sehingga enkode panjang lari harus lebih panjang dari input.
Peta ke titik-titik yang dikunjungi:
Filter pada non-self-berpotongan:
Menemukan pertama
T
di mana ini berhasil:f
.sumber