Befunge, 344 byte
&v>>>#p_:63p:43g`\!+v>/*53g+\01g:2%2*1-\2/!*63g+\0\:v
40$ v++!\`g14:p35:\<^2\-1*2%2p10::%4+g00:\g36\g35-1_v
#11^$_83p73v >1+:41g`!#v_$,1+:43g`!#v_@>->2>+00p+141^_
<p1^ vp< ^,g+7g36:<<<<1+55p36:<<<< ^1?0^#7g36g35*
8&p|!++!%9#2g+7g10\*!-g38g10!-g37:g00!!*<>3^
443>:!#v_>>1-::3%1-:53g+00p\3/1-:63g+01p^
^>^>>$#<"#"53g63g7+p41g53g-43g63g-+!#^_
Cobalah online!
Seperti @flawr disebutkan dalam jawaban MATLAB mereka, ini mungkin memakan waktu jika ukuran bidang adalah ukuran non-sepele. Sebenarnya cukup mudah untuk masuk ke situasi di mana itu benar-benar tidak layak untuk mencoba menunggu sampai selesai, karena Anda kemungkinan besar akan menunggu sampai akhir waktu.
Untuk memahami mengapa hal ini terjadi, akan sangat membantu untuk melihat program saat dijalankan di salah satu dari banyak "pengadu visual" Befunge. Karena data dan kode adalah hal yang sama di Befunge, Anda akan dapat melihat lintasan karena berubah seiring waktu. Sebagai contoh, berikut ini adalah animasi pendek yang menunjukkan seperti apa bagian dari lari di jalur lambat.
Setelah algoritma memutuskan untuk membuat belokan yang menentukan ke kiri di bagian bawah batas lapangan, pada dasarnya mengutuk dirinya sendiri untuk seumur hidup berkeliaran tanpa tujuan. Sejak saat itu, ia harus mengikuti setiap jalur yang mungkin ada di area berpagar itu sebelum dapat mundur dan mencoba belokan ke kanan. Dan jumlah jalur potensial dalam kasus ini dapat dengan mudah menjadi astronomi.
Intinya: Jika sepertinya butuh waktu lama, mungkin ide yang bagus untuk membatalkan eksekusi dan memulai lagi.
Penjelasan
Ini pada dasarnya adalah algoritma rekursif, mencoba setiap jalur yang mungkin melalui bidang, dan kemudian membatalkan langkah-langkah yang telah diikuti setiap kali macet. Karena Befunge tidak memiliki konsep fungsi, fungsi rekursif keluar dari pertanyaan, tetapi kita dapat meniru prosesnya dengan melacak keadaan pada stack.
Ini berfungsi dengan mengisi tumpukan dengan koordinat potensial yang mungkin ingin kita ikuti. Kemudian kami menarik satu set dari tumpukan dan memeriksa apakah itu cocok (yaitu dalam jangkauan dan tidak tumpang tindih dengan jalur yang ada). Setelah kami mendapat tempat yang bagus, kami menulis a #
ke playfield di lokasi itu, dan menambahkan detail itu ke tumpukan jika kami perlu mundur nanti.
Kami kemudian mendorong empat set koordinat tambahan ke stack (dalam urutan acak) yang menunjukkan jalur potensial yang dapat kita ambil dari lokasi baru ini, dan melompat kembali ke awal loop. Jika tidak ada jalur potensial yang layak, kami akan sampai ke titik di tumpukan tempat kami menyimpan lokasi yang #
kami tulis, jadi kami akan membatalkan langkah itu dan terus mencoba koordinat potensial dari satu langkah sebelumnya.
Seperti inilah bentuk kode dengan berbagai bagian komponen yang disorot:
Baca lebar dan tinggi bidang, dan dorong koordinat awal bersama dengan 0
penanda jenis untuk menunjukkan jalur potensial daripada lokasi mundur.
Periksa lokasi pelacakan ulang (ditunjukkan oleh 1
penanda jenis) yang dikembalikan dengan p
perintah sederhana , karena disimpan dalam format yang tepat yang diperlukan untuk menulis spasi kembali ke dalam playfield.
Periksa apakah koordinat masih di dalam playfield. Jika mereka di luar jangkauan, jatuhkan dari tumpukan dan putar kembali untuk mencoba koordinat potensial berikutnya.
Jika berada dalam jangkauan, dapatkan dua nilai berikutnya dari tumpukan, yang merupakan lokasi langkah sebelumnya (diperlukan dalam tes yang mengikuti ini).
Periksa apakah koordinat akan bersentuhan dengan segmen jalan yang ada. Lokasi langkah sebelumnya jelas diabaikan dari pemeriksaan ini.
Jika semua tes berhasil, tulis a #
ke dalam playfield, dan periksa apakah kita telah mencapai lokasi tujuan.
Jika sudah, tuliskan jalur terakhir, dan keluar.
Jika tidak, simpan koordinat ke tumpukan dengan 1
spidol tipe untuk mundur kembali nanti.
Ini terputus dengan perhitungan angka acak yang akan segera kita butuhkan.
Dorong empat tujuan potensial yang dapat dicapai dari lokasi saat ini. Angka acak menentukan urutan mereka mendorong dan dengan demikian urutan mereka akan diikuti.
Bungkus kembali ke awal loop utama dan proseskan nilai selanjutnya pada stack.