Selesaikan tantangan uHerbert ini

8

TL; DR : Selesaikan tantangan khusus ini, simulasi robot, dengan menginjak semua bantalan putih, dan menghindari bantalan abu-abu. Anda dapat menginjak pad putih beberapa kali, selama Anda menginjak setiap pad putih setidaknya sekali. Solusi dalam bahasa seperti Befunge dengan penunjuk instruksi 2D juga akan diterima, tetapi H hadir dengan program uHerbert dan spesifikasi bahasanya diberikan di bawah ini. Anda tidak memerlukan program uHerbert untuk menyelesaikan ini, tetapi itu membuat memeriksa solusi Anda jauh lebih mudah.

Inilah levelnya. Ini adalah jaringan sel 25x25, di mana robot dan setiap panel putih dan abu-abu menempati satu sel. Robot itu awalnya menghadap ke atas.

masukkan deskripsi gambar di sini

Latar belakang uHerbert

Herbert adalah simulasi robot yang pertama kali saya temui dalam tantangan pemrograman IGF (Independent Games Festival) online pada tahun 2008. Untuk waktu yang lama, saya kecewa karena saya tidak dapat mencoba tantangan setelah kontes yang sebenarnya berakhir. Untungnya, orang lain pasti sudah membaca pikiranku dan menyusun program kecil yang keren ini: uHerbert (alias mu-Herbert atau micro-Herbert).

H (Spesifikasi Bahasa)

Program ini merupakan simulasi robot, tetapi juga bertindak sebagai juru bahasa untuk bahasa pemrograman H yang hanya berfungsi untuk memindahkan robot.

Ada tiga instruksi:

  • S: robot melangkah maju satu sel
  • L: robot berbelok ke kiri 90 derajat di tempatnya
  • R: robot berbelok ke kanan 90 derajat di tempatnya

Ada tiga fitur pemrograman standar yang Anda inginkan: fungsi, parameter, dan rekursi. Dua tipe parameter yang berbeda didukung.

Parameter numerik

g(A):sslg(A-1)

Di sini, g adalah fungsi dengan parameter satu angka. Ini adalah kode pelat ketel; setelah ini, Anda dapat menulis program Anda yang sebenarnya dengan memanggil fungsi Anda dan menyampaikan argumen:

g(4)

Ini akan memanggil fungsi Anda 4 kali, dan rekursi secara otomatis berakhir ketika parameter Anda Amencapai nilai nol:

g(4) = sslg(4-1) = sslg(3) = sslsslg(2) = sslsslsslg(1) = sslsslsslssl

Parameter fungsional

Anda juga dapat menggunakan parameter fungsional, yang pada dasarnya hanya mereproduksi instruksi yang Anda berikan:

f(A):rAlA

Jadi jika Anda memanggil fungsi ini dan memberikan instruksi, itu akan mengevaluasi ke:

f(ss) = rsslss
f(sslssr) = rsslssrlsslssr

Sintaks lainnya

Fungsi dapat memiliki lebih dari satu parameter, dan mereka juga dapat memiliki kedua tipe tersebut. Mereka juga tidak memiliki parameter. Berikut ini adalah fungsi yang valid juga:

j:ssss
k(A,B):Ajjjk(A,B-1)

Seperti yang Anda lihat, fungsi j tidak mengambil parameter, dan fungsi k mengambil kedua jenis parameter. A adalah parameter fungsional dan B adalah parameter numerik, seperti dijelaskan di atas.

Rekursi tak terbatas

Rekursi tak terbatas juga diperbolehkan, tetapi hanya dapat dimulai sekali dan secara efektif dihentikan ketika Anda menginjak pad putih final (tanpa menginjak pad abu-abu):

m:sslssrm

Memecahkan kondisi

Tujuannya adalah untuk membuat robot menginjak semua bantalan putih, dan untuk menghindari menginjak salah satu bantalan abu-abu. Bantalan putih dapat diinjak beberapa kali, asalkan masing-masing diinjak setidaknya satu kali. Robot mampu menginjak titik mana pun di grid yang dapat dijangkau (beberapa tingkat memiliki dinding penghalang dan pada tingkat ini bantalan abu-abu semacam bertindak sebagai penghalang).

Teka-teki yang ditunjukkan sebelumnya tersedia di situs di atas dari level_pack2.zip dan disebut level3.txt . Baik program uHerbert dan paket level masih tersedia dari tautan di atas hingga hari ini (situs tersebut telah diarsipkan tetapi mesin arsip masih menyimpannya), tetapi mereka tidak diharuskan mencari solusi.

Saya ingin melihat solusi sesingkat mungkin sesuai kode golf.Solusi dalam bahasa selain H tidak akan diterima sebagai valid. (Pasti akan menarik untuk melihat solusi contoh dalam bahasa seperti Befunge di mana pointer instruksi berjalan pada grid 2D, tetapi per skor golf kode atom, hanya instruksi H yang dapat diberi skor yang akurat. Petunjuk pointer dapat diperlakukan sebagai posisi robot, misalnya.) Solusi yang valid adalah dimana robot menginjak semua bantalan putih (masing-masing setidaknya satu kali) dan tidak menginjak bantalan abu-abu. Melangkah di bagian lain dari grid itu baik-baik saja tetapi dalam puzzle khusus ini Anda tidak dapat melakukannya tanpa menginjak pad abu-abu. Posisi awal robot tidak dapat diubah.

Saya juga harus mencatat bahwa solusi yang melompat ke sel yang tidak berdekatan tidak akan diterima. Ini tidak mungkin untuk robot dalam simulasi, dan tidak akan mewakili solusi yang valid. H tidak mengizinkan ini. Jadi solusi yang valid harus terdiri dari satu langkah tunggal. Untuk setiap sel dalam grid, hanya ada empat sel yang berdekatan: yang ortogonal untuknya (di atas, di bawah, dan ke kiri dan ke kanan). Ini tentu saja akan melarang langkah diagonal, tetapi karena Anda hanya dapat mengubah kenaikan 90 derajat, langkah diagonal bahkan tidak mungkin.

Jika robot diberi instruksi yang mengharuskannya untuk pindah ke penghalang atau di luar grid, hasilnya pada dasarnya "derp" - robot mengenai dinding dan tetap di tempatnya, dan penunjuk instruksi bergerak ke instruksi berikutnya ( instruksi pada dasarnya dilewati).

Perhatikan tentang ukuran solusi

Ketika Anda membuka level ini dalam program, Anda akan melihat bahwa tampaknya mungkin untuk menyelesaikan dalam 13 byte. Saya benar-benar bingung bagaimana itu mungkin, dan ingin tahu seberapa dekat orang lain bisa sampai pada itu. Solusi terpendek saya adalah 30 byte dalam H. Jika ada yang ingin saya mempostingnya, saya akan, tetapi saya ingin melihat solusi lain sebelum memposting milik saya. Program ini juga memberi Anda skor, tetapi skornya tidak relevan dengan pertanyaan ini. Solusi dari skor apa pun akan diterima.

Tampaknya program uHerbert tidak menghitung tanda kurung atau titik dua sebagai bagian dari program Anda (Anda akan melihat ini ketika ia menghitung byte Anda). Jadi untuk keperluan pertanyaan ini, dalam bahasa H, tanda kurung dan titik dua tidak akan dihitung sebagai byte terhadap solusi Anda karena mereka terutama pembatas dan murni sintaksis daripada sifat semantik.

Tim
sumber

Jawaban:

6

H, 13 byte

a:ssr
b:sasaaab
b

Demo

animasi

Anders Kaseorg
sumber
Pintar. Saya ingat menyentil puzzle ini kembali ketika pertama kali diposting tetapi saya tidak menemukan solusi ini.
Draco18s tidak lagi mempercayai SE
Kerja bagus. Ini jelas merupakan solusi yang dimaksudkan.
Tim