この課題は、ザックトロニクスのゲームInfinifactoryに大まかに触発されています。
で表されるコンベアの長方形グリッドのトップダウンビューが表示され>v<^
ます。スペースで表されるコンベアのないセルが存在する場合があります。以下に例を示します。
> <vv <
v ^ >v v
>v^^>vv^
^>^ v
> v<v >>
>v v<^
この設定は、無限のスペースに暗黙的に囲まれています。
さらに、グリッドの左上隅にあるコンベヤー上に配置される長方形の貨物の寸法が与えられます。あなたの仕事は、貨物が静止するかどうか、またはループで移動するかどうかを把握することです。
もちろん、貨物は一度に複数のコンベヤーをカバーする可能性が高いため、各ステップで貨物の方向を把握するためのルールは次のとおりです。
反対側のコンベヤーは互いにキャンセルします。したがって、3x2の貨物が次のパッチのいずれかをカバーする場合(明確にするためにハイフンとパイプで概説)、結果は同じになります。
+---+ +---+ +---+ |>>^| | ^| |v^^| |^<<| |^ | |^^v| +---+ +---+ +---+
これらについても同じことが言えます。
+---+ +---+ +---+ |v^<| | | |><>| |>>>| |>> | |>><| +---+ +---+ +---+
貨物の下のコンベアの正確な位置は無関係であるため、どのペアをキャンセルしてもかまいません。
このキャンセルは、他のルールの前に適用されます。したがって、他のルールでは、最大2方向のコンベヤーのみが存在します。
- 貨物がコンベヤーをまったく覆わない場合(すべてのコンベヤーがキャンセルされる、スペースのみを覆うため、またはグリッドから完全に移動したため)、貨物は停止します。
貨物が一方の方向よりも多くのコンベヤをカバーしている場合、貨物はその方向に移動します。たとえば、3x2の貨物が次のパッチをカバーした場合
>> ^>^
より多くがあるので、それは、右に移動する
>
よりも^
。一方、それがカバーした場合>>^ ^
間のタイがありますので、この規則は、適用されない
>
とは^
。これにより、隣接する方向間に同点がある場合のみが残ります(反対方向間の同点がキャンセルされます)。この場合、貨物は既に移動している軸に沿って移動し続けます。たとえば、右移動または左移動の3x2貨物がパッチを覆っている場合
>>^ ^
右に移動します。このパッチに到着して上下に移動した場合、代わりに上に移動します。この種の衝突がシミュレーションの最初のステップで発生する場合、貨物が右に動いていたと仮定します。
詳細な例
上部のコンベアグリッドと3x2の貨物を考えてください。以下は、プロセスの段階的な視覚化です。各ステップはグリッドで構成され、貨物はで表され#
、貨物で覆われたコンベヤーを示す小さなボックス、キャンセル後のコンベヤーを備えた別のボックス、および貨物の移動場所を決定するルールで構成されます。
###vv < > <vv < > <vv < > <vv < > <vv < > <vv <
###^ >v v ###^ >v v v ^ >v v v ^ >v v v ^ >v v v ^ >v v
>v^^>vv^ ###v^^>vv^ ###v^^>vv^ ###^^>vv^ ###^>vv^ >###>vv^
^>^ v ^>^ v ### ^>^ v ###^>^ v ###>^ v ###^ v
> v<v >> > v<v >> > v<v >> > v<v >> > v<v >> > v<v >>
>v v<^ >v v<^ >v v<^ >v v<^ >v v<^ >v v<^
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
|> <| | | | v | | v | | >| | >| | >v| | >v| |>v^| |> ^| |v^^| | ^^|
| v | | v | | >| | >| | | | | | | | | | ^| | | | ^>| | >|
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
Rule 3 Rule 4 Rule 3 Rule 4 Rule 4 Rule 3
================================================================================
> <vv < > <### < > <vv <
v ###v v v ###v v v ###v v
>###>vv^ >v^^>vv^ >###>vv^
^>^ v ^>^ v ^>^ v
> v<v >> > v<v >> > v<v >>
>v v<^ >v v<^ >v v<^
+---+ +---+ +---+ +---+ +---+ +---+
|^ >| | >| |vv | | v | |^ >| | >|
|v^^| | ^^| |^ >| | >| |v^^| | ^^|
+---+ +---+ +---+ +---+ +---+ +---+
Rule 3 Rule 4 Rule 3
この時点で、貨物は最後の2つのフレーム間でループに入ります。
次に、代わりに2x3の貨物を検討します。
##<vv < >##vv < > <vv < > <vv < > <vv < > <vv <
## ^ >v v ##^ >v v ##^ >v v v ^ >v v v ^ >v v v ^ >v v
##>v^^>vv^ ##v^^>vv^ ##v^^>vv^ ##v^^>vv^ ##^^>vv^ >v^^>vv^
^>^ v ^>^ v ## ^>^ v ## ^>^ v ##^>^ v ##^>^ v
> v<v >> > v<v >> > v<v >> >##v<v >> > ##<v >> > ##<v >>
>v v<^ >v v<^ >v v<^ >v v<^ >v v<^ ## v<^
+--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+
|> | |> | | <| | | |v | |v | | >| | >| |>v| |>v| | | | |
| v| | v| |v | |v | | >| | >| | | | | | | | | | v| | v|
| | | | | >| | | | | | | | | | | | v| | v| |>v| |>v|
+--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+
Rule 4 Rule 3 Rule 4 Rule 3 Rule 3 Rule 3
================================================================================
> <vv < > <vv < > <vv <
v ^ >v v v ^ >v v v ^ >v v
>v^^>vv^ >v^^>vv^ >v^^>vv^
^>^ v ^>^ v ^>^ v
> ##<v >> > v<v >> > v<v >>
## v<^ ## v<^ >v v<^
## ## ##
## ##
##
+--+ +--+ +--+ +--+ +--+ +--+
| v| | v| |>v| |>v| | | | |
|>v| |>v| | | | | | | | |
| | | | | | | | | | | |
+--+ +--+ +--+ +--+ +--+ +--+
Rule 3 Rule 4 Rule 2
最後のステップでは、貨物がグリッドから移動したため、規則2が適用されます。したがって、貨物は停止し、ループは発生しません。
ルールと仮定
入力は、貨物の幅と高さとともに、上記のコンベアグリッドになります。これらの3つのパラメーターは、任意の便利な順序と形式で使用できます。グリッドのために、あなたが行と単一の文字列を読み取ることができることは、この手段は、個々のグリッドセルがまだ文字で表されている限り、改行または他の文字、または文字列の配列、又は文字の配列の配列によって分離>v<^
およびスペース。
セットアップの結果、少なくとも2フレームのループが発生する場合は真実の値を、貨物が停止する場合は偽の値を出力する必要があります。
グリッドがスペースのある長方形にパディングされ、貨物が最初にグリッドに収まると仮定できます。
プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、STDOUT(または最も近い代替)、関数の戻り値または関数(out)パラメーターを介して結果を出力できます。
これはコードゴルフなので、最短の回答(バイト単位)が勝ちです。
テストケース
テストケースはグリッドごとにグループ化されます。
Grid (2x2):
>v
^<
Width Height Loop?
1 1 True
1 2 True
2 1 True
2 2 False
Grid (3x3):
> v
^ <
Width Height Loop?
1 1 False
1 2 False
1 3 False
2 1 False
2 2 True
2 3 True
3 1 False
3 2 True
3 3 False
Grid (4x3):
>^>v
v^v
^ <<
Width Height Loop?
2 2 False
Grid (6x5):
>v>v>v
^v^v^v
^v^v^v
^>^>^v
^<<<<<
Width Height Loop?
1 1 True
1 2 False
2 1 True
2 2 True
2 4 True
2 5 False
3 1 False
3 2 True
3 3 True
3 5 True
6 2 False
6 3 True
6 5 False
Grid (10x6):
> <vv <
v ^ >v v
>v^^>vv^
^>^ v
> v<v >>
>v v<^
Width Height Loop?
1 1 False
2 3 False
2 6 False
3 2 True
5 4 False
6 1 True
10 6 False
テストケースの追加セットとして、グリッドがスペースのみで構成される入力は、偽の結果を生成する必要があることを考慮してください。
すべてのテストケースを手動で確認したため、間違いを犯したと思われる場合はお知らせください。
[^^/v<]
は[[0,1] [0,1];[0,-1] [-1,0]]
?それとも、STDIN、文字列入力、文字配列入力などであるかどうかは私たち次第ですが、それでも^、v、>、および<の形式である必要がありますか?
><^v
またはスペースで表す必要があります。それを明確にします。