Koopaシェルシーケンス


19

さまざまなスーパーマリオゲームで、赤の Koopa Troopaシェルは、平らな表面で摩擦なくスライドし、途中にあるレンガブロックを破壊できます。シェルがレンガブロックに当たると、ブロックが壊れて空のスペースに変わり、Koopaシェルは方向を反転します。例として、こちらの赤いシェルをご覧ください

スーパーマリオのレベルが1ブロックだけで、すべてのグリッドセルがレンガまたは空のスペースであると仮定します。ただし、右に移動するシェルを含む一番左のセルを除きます。レベルも周期的であるため、シェルがレベルの右端または左端を出ると、反対側から再び入ります。この状況では、シェルはレベル内のすべてのブリックブロックから跳ね返り、それがなくなるまで継続します。最後のレンガブロックが壊れた直後に、シェルはどこまで移動しましたか?

チャレンジ

負でない10進整数を取り込むプログラムまたは関数を作成します。この数値は、先行ゼロなしでバイナリで表現され(唯一の例外は0自体です)、1ブロックの高レベルレイアウトをエンコードします。A 1はレンガブロックで、a 0は空のスペースです。

Koopa Shellはレベルの左端に挿入され、最初は右に移動しています。たとえば、入力に関連付けられているレベル39

>100111

なぜなら100111バイナリで39であり、>そして<右表し、それぞれのシェルを動かす左。

最後のブロック(別名1)が壊れたら、シェルが移動した合計距離を印刷するか返す必要があります。

39is の出力と7レベルの変更は次のようになります。

Level      Cumulative Distance
>100111    0
<000111    0
>000110    0
0>00110    1
00>0110    2
000>110    3
000<010    3
00<0010    4
0<00010    5
<000010    6
000001<    7
000000>    7  <-- output

同様に、の出力61次のとおりです。

Level    Cumulative Distance
>110     0
<010     0
001<     1
000>     1  <-- output

バイト単位の最短コードが優先されます。

参考のため、ここでの入力に対して出力される0のは20

0 0
1 0
2 0
3 0
4 0
5 0
6 1
7 1
8 0
9 0
10 1
11 2
12 2
13 1
14 3
15 3
16 0
17 0
18 1
19 3
20 2

そして、ここに入力までの出力があります1000

回答:


6

CJam、29 26 24バイト

3バイトを節約してくれたSp3000に感謝します。

q~2b{_1&}{W\({%}*0+}w],(

テストスイート。(これは、0からSTDINで指定された整数までのすべての結果を出力します。)

説明

これにより、ヘッドの仕様が少し変わります。バイナリ文字列を介してシェルを移動する代わりに、シェルが常に右側を向くようにバイナリ文字列をシフトおよびリバースします。

q~      e# Read and evaluate the input.
2b      e# Convert to base-2 to get the "level".
{_1&}{  e# While there is a 1 in the level...
  W\    e#   Put a -1 below the level.
  (     e#   Pull off the first digit, i.e. the cell the shell is pointing at.
  {     e#   If it's a 1 (i.e. a brick)...
    %   e#     Reverse the level, consuming the -1. This isequivalent to reversing the 
        e#     shell in place.
  }*
  0+    e#   Append a zero. If the cell was a brick, this just replaces it with an empty
        e#   cell. Otherwise, this rotates the level by one cell. This is equivalent 
        e#   to moving the shell one cell through the periodic level.
        e#   Note that if the leading cell was 0, the -1 remains on the stack.
}w
],(     e# Wrap the stack in an array, get its length and decrement.

5

Pyth、24バイト

&.WsH_XZeaYxZ1 0jQ2ssPBY

オンラインで試す:デモンストレーションまたはテストスイート

次の22バイトのコードもトリックを行う必要があります。Pythコンパイラのバグにより、現在は機能しません。

&u_XGeaYxG1ZjQ2)ssPBPY

編集:バグが修正されましたが、もちろん解決策はカウントされません。

オンラインで試す:デモンストレーションまたはテストスイート

説明:

前面と背面を交互に切り替えて、次のことを行います。

  • 1を検索します
  • このインデックスをリストに入れて覚えておいてください
  • この1を0に更新します

1が残っていない場合、距離を計算します。重要:リスト内の各距離は、最後の距離を除いて、シェルによって2回(前後に)移動します。

&.WsH_XZeaYxZ1 0jQ2ssPBY   implicit: Y = empty list
                jQ2        convert input number to binary
 .WsH                      start with Z=^; 
                           while the sum(Z) > 0, apply the the following to Z:
           xZ1                index of 1 in Z
         aY                   append this to Y
        e                     take the last element of Y (=this index)
      XZ       0              set this 1 (at index ^) in Z to 0
     _                        and revert the order of Z
                           this returns a list of zeros
&                          don't print ^, print the next thing
                     PBY   creates the list [Y, Y[:-1]]
                    s      combine these lists
                   s       sum up the distances
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.