TL; DR:すべての白いパッドを踏み、灰色のパッドを避けて、この特定の課題であるロボットシミュレーションを解決します。各白いパッドを少なくとも1回踏む限り、何回でも白いパッドを踏むことができます。2D命令ポインターを使用したBefungeなどの言語でのソリューションも受け入れられますが、HにはuHerbertプログラムが付属しており、その言語仕様は以下のとおりです。これを解決するためにuHerbertプログラムは必要ありませんが、ソリューションのチェックがはるかに簡単になります。
レベルは次のようになります。これはセルの25x25グリッドで、ロボットと各白とグレーのパッドが1つのセルを占めます。ロボットは最初は上向きです。
uHerbertの背景
Herbertは、2008年にオンラインIGF(Independent Games Festival)プログラミングの課題で最初に遭遇したロボットシミュレーションです。実際のコンテストが終了した後、長い間、課題を試すことができなかったことにがっかりしました。幸いなことに、誰かが私の心を読んで、このダンディな小さなプログラムuHerbert(別名mu-Herbertまたはmicro-Herbert)をコード化したに違いありません。
H(言語仕様)
プログラムはロボットのシミュレーションですが、ロボットを動かすためだけのプログラミング言語Hのインタプリタとしても機能します。
3つの指示があります。
- S:ロボットは1セル前に進みます
- L:ロボットは所定の位置で左に90度回転します
- R:ロボットは正しい位置に90度回転します
関数、パラメータ、および再帰という3つの標準プログラミング機能を自由に使用できます。2つの異なるパラメータタイプがサポートされています。
数値パラメーター
g(A):sslg(A-1)
ここで、gは1つの数値パラメーターを持つ関数です。これはボイラープレートコードです。この後、関数を呼び出して引数を渡すことにより、実際のプログラムを作成できます。
g(4)
これにより、関数が4回呼び出され、パラメータA
がゼロの値に達すると、再帰が自動的に終了します。
g(4) = sslg(4-1) = sslg(3) = sslsslg(2) = sslsslsslg(1) = sslsslsslssl
機能パラメーター
機能パラメーターを使用することもできます。これは、基本的に、渡した命令を再現するだけです。
f(A):rAlA
したがって、この関数を呼び出して命令を渡すと、次のように評価されます。
f(ss) = rsslss
f(sslssr) = rsslssrlsslssr
その他の構文
関数は複数のパラメーターを持つことができ、両方のタイプを持つこともできます。あるいは、パラメータを持たない場合もあります。以下は、どちらも有効な関数です。
j:ssss
k(A,B):Ajjjk(A,B-1)
ご覧のとおり、関数jはパラメーターを取らず、関数kは両方のタイプのパラメーターを取ります。上記のように、Aは機能パラメーターで、Bは数値パラメーターです。
無限再帰
無限再帰も許可されていますが、開始できるのは1回だけであり、最後の白いパッドを踏んだときに効果的に終了します(灰色のパッドを踏んだことはありません)。
m:sslssrm
条件を解決する
目標は、ロボットにすべての白いパッドを踏ませ、灰色のパッドを踏まないようにすることです。白いパッドは、それぞれが少なくとも1回踏まれている限り、何回でも踏むことができます。ロボットは、到達可能なグリッド内の任意のポイントを踏むことができます(一部のレベルにはバリア壁があり、このレベルでは灰色のパッドが一種のバリアとして機能します)。
前に示したパズルは、上記のサイトのlevel_pack2.zipから入手でき、level3.txtという名前です。uHerbertプログラムとレベルパックの両方は、現在のところ上記のリンクから引き続き利用できます(サイトはアーカイブされていますが、アーカイブエンジンは引き続きホストしています)が、ソリューションには必要ありません。
コードゴルフごとに可能な最短の解決策を見たいのですが。H以外の言語でのソリューションは、有効なものとして受け入れられません。(Befungeのような言語で命令ポインターが2Dグリッド上を移動する例のソリューションを見るのは確かに興味深いでしょうが、アトミックコードのゴルフスコアリングでは、H命令のみに正確なスコアを与えることができます。命令ポインターは次のように扱うことができます。たとえば、ロボットの位置。)有効な解決策は、ロボットがすべての白いパッドを踏んで(少なくとも1回は)、灰色のパッドを踏まないというものです。グリッドの他の部分を踏んでも問題ありませんが、この特定のパズルでは、灰色のパッドを踏まないとこれを実行できません。ロボットの開始位置は変更できません。
また、隣接しないセルにジャンプするソリューションは受け入れられないことにも注意してください。これはシミュレーションのロボットでは不可能であり、有効なソリューションを表すものではありません。Hはとにかくこれを許可しません。したがって、有効なソリューションは、単一のステップで構成されるものでなければなりません。グリッド内の各セルには、隣接するセルが4つしかありません。それに隣接するセル(上、下、左と右)です。もちろん、これは対角ステップを許可しませんが、90度ずつしか回転できないため、対角ステップは不可能です。
ロボットがバリアまたはグリッドの外に移動する必要がある命令を与えられた場合、結果は基本的に「derp」になります。ロボットは壁にぶつかってそのままの場所に留まり、命令ポインタは次の命令(命令は基本的にスキップされます)。
ソリューションサイズに関する注意
プログラムでこのレベルを開くと、明らかに13バイトで解決できることがわかります。私はそれがどのように可能であるかについて完全に困惑しています。私の最短の解決策はHで30バイトです。誰かがそれを投稿してほしいと思ったら、私はそうしますが、私の投稿の前に他の解決策を見たいです。プログラムもあなたにスコアを与えますが、スコアはこの質問とは無関係です。あらゆるスコアのソリューションが受け入れられます。
uHerbertプログラムは、括弧やコロンをプログラムの一部として数えないようです(これは、バイトを数えるときに表示されます)。したがって、この質問の目的のために、H言語では、括弧とコロンは主に区切り文字であり、本質的に意味論的ではなく純粋に構文的であるため、ソリューションのバイトとしてカウントされません。