ドミノのセットアップを考えると、あなたの仕事は、どのドミノが落ち、どれが落ちないかを把握することです。
入力
ドミノのセットアップの長方形のASCII表現を取ります。ASCIIグリッドには次の文字が使用されます。
(スペース):空のセル
|
、-
、/
、\
:ドミノ
ドミノは、次の文字で表される8方向に分類できます(WASDの向きに似ています)。
Q W E
A D
Z X C
1つ以上のドミノがこれらの文字の1つで置き換えられ、開始時にドミノが押し込まれたことを示します。以下に例を示します。
D||||/
- /
- -
- -
/|||||
このチャレンジを入力解析の演習にしたくないので、次の入力フォームのいずれかが許可されます。
- グリッド付きの文字列(必要に応じて、ディメンションが前に付く場合)
- 各行に1つの文字列を含む配列/リスト/タプル(オプションで幅と高さの整数とともに)
- グリッドセルごとに1つの文字列/文字を含む(ネストされた)配列/リスト/タプル(オプションで幅と高さの変数とともに)
STDINから読み取るか、関数の引数を取るか、入力が変数に格納されることを期待することもできます。
出力
STDOUTに書き込むか、有効な入力形式のいずれかで結果のグリッドを返す(または変数に保存する)ことで、どのドミノが落ちたか、落ちなかったかを示します。つまり、倒れた各ドミノを置き換え、#
それぞれの立っているドミノを入力のままにしておきます。
ルール
もちろん、ドミノはセットアップを通じて落下を伝播します。競合状態が存在する可能性があるため、タイムステップが固定されており、立ち下がりがタイムステップごとに1つのグリッドセルを伝播すると仮定します。
ドミノは一般に直感的に期待する方法に該当しますが、常識の厳密な仕様は非常に長いことが判明しました。申し訳ありませんが、例が役立つことを願っています。ここに、すべてのユニークな2タイルの組み合わせ(回転と反射まで)の要点があります。厳格なルールをお読みください。
各ドミノは、次の2つの方向にのみ落ちることができます。
W Q E
A | D - / \
X C Z
ドミノが倒れるたびに、倒れる方向のセルに影響を与えます。そのセルに同じ方向または45度異なる方向に落ちる可能性のあるドミノが含まれている場合、そのドミノは次のタイムステップでドミノを行います。
例:
D| -> DD (falls in same direction)
D/ -> DC (falls at 45 degrees)
C -> C (falls at 45 degrees)
- X
対角線方向のドミノ(/
または\
)が倒れるたびに、そのセルとその倒れた方向のセルの両方に触れる2つのセルにも影響します。これらのセルに、元のドミノと同じ方向、またはそれから離れる軸に沿った方向に落ちる可能性のあるドミノが含まれている場合、そのドミノは次のタイムステップでそれを行います。
例:
C/ -> CC (the cell in the direction of the fall is the one below
the /, so it falls in the same direction)
C| -> CD (falls in the axis-aligned direction away from the C)
C- -> C- (the direction away from the Q is W,
or but neither - nor \ can fall to W)
C\ -> C\
例外:ドミノが一度に両方の有効な方向にプッシュされる場合(つまり、上記のルールのいずれかが競合する場合)、落ちません。
例:
D|A -> D|A (central domino in pushed in both directions)
Z Z (although it's pushed in one direction by two dominoes
D\A -> D\A and in the other by only one, it doesn't fall)
X X (the domino is being pushed from two opposing sides
D-A -> DXA D and A, but neither is valid for that domino. Hence,
there is no conflict and the X can push the domino over)
Z Z (pushed in the same direction by two dominoes, so falls)
\A -> ZA
Z Z Z (once the conflict arises, the affected
\ -> Z -> Z domino is locked in its position and can't
D|A D|A D|A be pushed over by future dominoes)
例
8 5
D||||/ ######
- / - #
- - --> - #
- - - #
/||||| /|||||
===============================================
17 9
E|/|||/ #######
- - # #
- - # #
- - # #
/|||/|||||||||/ --> ###############
/ - # #
/ - # -
/ - # #
/|||||\ #######
===============================================
19 8
\|/ ###
- - # #
D||||/|\ /|||/ ######## #####
/ - # #
- \- --> - \#
\- \ - #- \ #
D||||\ / \ / ###### / \ #
|\ ||||| |\ #####
==============================================
11 11
-\\\/|\|\-| -\##/|###-|
-|\\||\-|\- -|#####-|\-
|\//\//|-/- |#//\//|#/-
\|//|-|\-\| #####-|##\|
---||/-\//| #-######//|
///|||\---- --> #/#####----
-|/---|-|-\ #|##--|-|-\
--|--\/|/// ####-\/|///
/|//--|//-| ####--|//-|
|/\-|||-/-\ |/\####-/-\
E||\-|\---/ ####-|\---/
あなたが私が間違いを犯したと思ったら教えてください(特に最後の間違い)
E
違いがあるはずでした(違いを生むというわけではありません...)。インデントの深さを最小限に抑えることで、たくさんの文字を保存できるようです。