セットアップ
下の図1に示すように、29の番号の付いたセルを含む奇妙な形のボックスを考えます。
この2Dボックスの内側には、2つの種の正方形の動物があります。シャブルとスモウルです。図1(a)は、青のシャブルと赤のスモウルを示しています。各クリーチャーは、1つのグリッドセルを占有します。ボックスには0から26のシャブルが含まれますが、常に2つのスモルが含まれます。
重力の影響を受けて、シャブルとスモールがボックスの底に座って、その下にあるものの上に積み重ねられます。両方の種は非常に怠惰であり、永久に動かないままです。
ボックスには、黒い正方形として描かれた、1つのグリッドセルを占有するstotも含まれています。ストットは重力の影響を受けません。
図に示されているように、ボックスにはセル28の底部に1つの開口部があります。
テキストでボックス内shubbles、smolesの構成、およびSTOTを表現するために、我々は29文字の文字列を使用して、グリッドセルごとに一つの文字、列挙された順に、と.
、空のセルを表すo
、shubbleを表すx
smoleを表します、@
ストットを表す。たとえば、図1(a)の構成は文字列で表されます.........@...o....ooo..xox...
。
操作
ボックスは90度の任意の倍数で回転できます。ボックスが回転している間、シャッフルとスモールはグリッドセル内で静止したままです。回転が完了するとすぐに、それらは次のいずれかになるまで直接下に落ちます:i)下の壁によってブロックされるii)下の小槌、くす、またはstotによってブロックされる、またはiii)セル28の穴から落ちるボックスを終了します。ストットは落ちません。生き物がその上に乗っていても、現在のセルに固定されたままです。
クリーチャーが落下して新しい安定した構成に達するまで、ボックスを再び回転させることはできません。
テキストでは、ボックスの回転は+
、時計回りの90度回転、|
180度の回転、および反時計回りの90度の回転によって示され-
ます。
さらに、ストットは、1つのグリッドセルの増分で4つのコンパス方向に移動できます。移動は:i)ストットとクリーチャーの間で衝突を引き起こす(つまり、宛先グリッドセルは空でなければならない)、ii)ストットと壁の間で衝突を引き起こす、またはiii)ストットがボックスから出るセル28の穴。
また、(現在の重力に対して)その上にクリーチャーが置かれている場合、ストットは移動しない可能性があります。
テキストでは、ストの動きは<
、左、>
右、^
上、v
下で示されます。ストットムーブは常に、図に示されている「標準」(回転されていない)フレームを基準に指定されます。つまり、ストットがセル10にある場合、移動^
すると常にセル5に移動し、移動>
すると常にセル11に移動します。ボックスの向きは、移動の方向には影響しません。
操作のシーケンスは、左から右への文字列を使用してエンコードされます。たとえば、文字列+<<^-
は、ボックスが時計回りに90度回転し、次にstotが(標準フレームに対して)左に2回、上に移動し、次にボックスが反時計回りに90度回転して元の方向に戻ることを示します。
チャレンジ
完全に正当な理由(私が開示することはできません)のために、1つの臭いを放出することなく、すべてのシャッフルを箱から放出したいと考えています。これを達成するために、上で具体的に説明した操作を使用できます。
この問題を解決する前に、さまざまな操作がボックスの内容にどのように影響するかをシミュレーションする必要があります。これがこの課題の焦点です。
stdin
(または同等のもの)から2つの引数を受け入れるプログラムを記述する必要があります。
- ボックスの初期状態を説明する文字列
- 一連の操作
両方の引数が構文的に有効であり、ボックスが標準の向きで始まり、ボックスの初期状態が安定していて合法であると想定する場合があります。
プログラムはstdout
、次のいずれかに(または同等の)出力する必要があります。
(ケース1)ボックスの最終状態。文字列として表されます。移動のシーケンスが合法で(ストット移動ルールに違反していない)、smoleがボックスから出ない場合。ボックスの最終的な向きは重要ではありません。
(ケース2)
!
移動のシーケンスが不正である、またはsmoleがボックスから出た場合は、単一の感嘆符
得点
優勝したプログラムは、バイト数で最も短いプログラムであり、非常に有利なボーナス乗数がいくつかあります。
ケース1のエンコードされた出力を印刷する代わりに、0.65の乗数を要求します。プログラムは、シャブル、スモル、ストト、空のセルの仕様文字を使用して、ボックスの最終的な状態と方向でASCII画像を出力し、
*
セル28の穴のすぐ外側のセル内。先頭と末尾の空白は無視されます。たとえば、図1(a)を90度回転すると、出力は次のようになります。
. . ..... .o... xo.@. *ooo.. x .
ケース1のエンコードされた出力を印刷する代わりに、プログラムがイメージファイルを出力するか、最終的な状態と向きのボックスの写真を含むGUIウィンドウを表示する場合、0.22の乗数を要求します。写真は図1(a)のスタイルである必要があり、グリッドセル、壁、および色付きのボックスを使用した生き物/ストットを示しています。
ケース1のエンコードされた出力を印刷する代わりに、0.15の乗数を要求します。プログラムは、アニメーションの.gifまたはアニメーションのGUIウィンドウを1秒間隔でシミュレーションのすべての中間状態を表示して出力します。0.22乗数と同じ画像規則が適用されます。アニメーションの最初のフレームは、シミュレーションの初期状態を示している必要があります。さらに、アニメーションは「非表示」の中間状態を表示する必要があります。
回転後、アニメーションフレームごとに1セルずつ安定した構成に落ちるシャッブル/スモル
ボックスの中間の90°回転状態、180°回転
請求0.12の乗算器をプログラムは、上記のスタイルのアニメーション.gifまたはアニメーションGUIウィンドウを生成する場合、しかし20のFPSやショーで実行
ボックス回転のスムーズで連続的なアニメーション
stotの動きのスムーズで連続的なアニメーション、および安定した構成に落ちるシャブル/スモルのアニメーション
セル28の穴から落下するシャッブルは、ボックスから出て行くように示され、完全に外に出ると消えます。1秒あたり1回以下の操作が実行される限り、アニメーションのタイミングを独自に選択できます。
合計スコアはfloor( base score * multiplier )
です。請求できる乗数は1つだけです。
やっぱりスモレの世界。;)