シャブルとスモル-パートI


10

セットアップ

下の図1に示すように、29の番号の付いたセルを含む奇妙な形のボックスを考えます。

シャブルとスモウル

この2Dボックスの内側には、2つの種の正方形の動物があります。シャブルとスモウルです。図1(a)は、青のシャブルと赤のスモウルを示しています。各クリーチャーは、1つのグリッドセルを占有します。ボックスには0から26のシャブルが含まれますが、常に2つのスモルが含まれます。

重力の影響を受けて、シャブルとスモールがボックスの底に座って、その下にあるものの上に積み重ねられます。両方の種は非常に怠惰であり、永久に動かないままです。

ボックスには、黒い正方形として描かれた、1つのグリッドセルを占有するstotも含まれています。ストットは重力の影響を受けません

図に示されているように、ボックスにはセル28の底部に1つの開口部があります。

テキストでボックス内shubbles、smolesの構成、およびSTOTを表現するために、我々は29文字の文字列を使用して、グリッドセルごとに一つの文字、列挙された順に、と.、空のセルを表すo、shubbleを表すxsmoleを表します、@ストットを表す。たとえば、図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つだけです。

やっぱりスモレの世界。;)


2
仕様の+1ですが、おそらく参加しません。
John Dvorak

楽しそうですね。念のため、ボックスの形状は完全に固定されていますね。他の形状を考慮する必要はありませんか?
IngoBürk2014年

@IngoBürk:正解です。ボックスの形状は固定されています。
COTO 2014年

画像出力の場合、画像をリソース(または任意の種類のリソース)として使用できますか、それともコード内で完全に描画する必要がありますか?それを使用できるとしたら、それはどのようにカウントされますか?これを試してみるつもりですが、今は休暇中です。
IngoBürk2014年

1
プログラムの合計にバイト数を含める限り、外部グラフィックリソース(画像、SVGマークアップなど)を使用できます。基本的なイメージは、それほど複雑である必要はありません。グリッドを構成する12本の線。壁; ボックス内の色付きのボックス。必要に応じて、色付きのボックスでグリッドセル全体を塗りつぶすことができ、壁は最も外側のセルの境界に沿って正確にトレースできます。したがって、6x6の正方形の座標グリッドに長方形、線、およびポリラインを描画することで、画像全体を定義できます。
COTO 2014年

回答:


2

まだ入手されていないMATLAB * 0.15

誰かがこれが正しく機能するかどうかの推測を危険にさらすことができればそれは素晴らしいでしょう。

n = @()input('', 's');
E = @()fprintf('!');
M = zeros(7,9);
G = M;
I = [9:7:44 17:7:52 18:7:46 12:7:47 20:7:55];
M0 = M;
M0(I) = 1;
M([I 49]) = 1;
G(I) = n()-46;
trot = 0;
Xtr = [0 1-10i 11-7i 8+i];
X0 ='c66++66++oozzoozzn'-i*'YYNNAA--  ++88LLYY'-22+22i;
for a = [97 n()]
    a = find('-|+a^<v>'==a);
    if a<5
        R = @(m) rot90(m, a);
        G = R(G);
        [nr,nc] = size(G);
        M = R(M);
        M0 = R(M0);
        trot = mod(trot+a,4);
        X = exp(i*pi*trot/2)*X0 + 11*Xtr(trot+1);
    else
        z = find(G==18);
        J = z + [-nr,1]*[0,-1;1,0]^(trot+a)*[1;0];
        if ~M0(J) | G(J) | G(z+1)
            E();return
        end
        G(z) = 0;
        G(J) = 18;
    end
    fall = 1; 
    while fall
        clf
        plot(X/11,'k','LineW',3);
        for x = 2:nc; for y = 2:nr
             ch = G(y,x);
             if M0(y,x) 
                 rectangle('Po',[x,-y,1,1],'F',~ch|ch==[74 1 65]);
             end
        end;end
        pause(1);
        G2 = G;
        for r = nr-1:-1:2
            s = G2 > 30;
            f = G2(r,:) .* (s(r,:) & ~s(r+1,:) & M(r+1,:) & G(r+1,:)~=18);
            if r==size(G,1)-1 & any(f==74)
                E();return
            end
            G2(r:r+1,:) = G2(r:r+1,:) + [-f;f];
        end
        G2 = G2 .* M0;
        fall = any(any(G2 ~= G));
        G = G2;
    end 
end

いくつかのランダムな動きの最終結果の例:

.........@...o....ooo..xox...
+>|<-v+^+

ここに画像の説明を入力してください


1
実際にアニメーションのGIFを見せてもらえますか?
マーティンエンダー2014年

涼しい!私は今夜​​それをチェックします(そしていくつかのテストケースを投稿します)。
COTO 2014年

このプログラムでは、アニメーション.gifを出力する必要はありませんが、feerumを生成する場合は、この記事で簡単に作成する方法を説明します。
COTO 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.