各セルを空(.)または完全(0)にすることができる長方形の2次元グリッドを考えます。
例えば
..00....
0000....
.00000..
000...00
..000000
000.00..
グリッドは無限と見なされ、描かれた領域外のすべてのセルは空です。
目標は、塗りつぶされたスペースをカバーし、それぞれがグリッドの4セル(2×2)を占める明確に形作られた7つのレンガのセットを使用して、空いているスペースを開いたままにすることです。
これらは7つのブリックです。
ブロック-1種類
11 11スラブ-2種類
.. 2233 ..階段-4種類
.4 445. 5566 .677 7.
これらのブリックは常に、入力グリッドのセルの2倍の幅と高さのセルを持つグリッドに揃える必要があります。各ブリックはこの大きなグリッドの1つのセルしか占有できませんが、小さなグリッドを大きなグリッドの下に移動(上下、左、右に移動)して、カバーを見つけるためのオプションを増やすことができます。グリッドも個別のブリックも回転できません。
したがって、上記の例をカバーする(解決する)方法の1つは次のようになります。
..11....
2211....
.47733..
447...22
..771133
227.11..
(同一の隣接するレンガはまだあいまいさを引き起こす可能性がありますが、より大きなグリッドを注意深く識別することで解決します。)
の無効なソリューション
000000
000000
は
566774
556744
レンガはすべて大きなグリッドに合わせて整列しているわけでも、1つのセルだけを占めているわけでもないからです。
ここでの有効な解決策は、3ブロック連続です:
111111
111111
また、別の有効なソリューションには6つのスラブが含まれます。
......
222222
333333
......
入力グリッドには複数のソリューションがあることに注意してください。
の無効なソリューション
00.00
00...
は
11.33
11...
レンガが大きなグリッドに整列しないためです。スラブは左または右に1つずつ移動する必要がありますが、もちろんカバーは不完全になります。この入力グリッドには解決策がありません。
チャレンジ
対象となるグリッドを表す.のと0のテキストの長方形ブロックを(stdin /コマンドライン経由で)取り込むプログラムを作成します。
有効なカバーソリューションがある場合、上記と同じ方法でいずれかのソリューションを(stdoutを介して)印刷し、すべて0のを適切な1スルー7ブリックに置き換えます。
解決策がない場合、プログラムは何も出力せず、静かに正常に終了します。
ノート
入力と出力は同じ長方形の寸法を持つ必要はありません。出力には、すべて
.のの無関係な行や列を含めることができます(ソリューションを無効にしない限り)。また
.、塗りつぶされたスペースに影響しない場合は、すべての'の行と列をトリムしても問題ありません。例えば222222 333333に有効なソリューションです
000000 000000逆に、2つの空の列を
00..00削除することはできません。それは、埋められたスペースを乱すからです。オプションで、入力の末尾に改行が1つあると想定することもできます。解決策がない場合でも、出力の単一の末尾の改行でも問題ありません。
完全に空(すべて
.)のグリッドと些細な0x0グリッドは、心配する必要がある入力ケースではありません。ただし、1×10グリッドは、少なくとも1つを含む他のすべてのグリッドと同様0です。(入力グリッドの幅または高さが均等であるとは思わないかもしれません!)プログラムの代わりに、入力を文字列引数として受け取り、通常どおり出力を出力するか、文字列として返す関数を作成できます。どれfalsy値は解が存在しない場合に返すことができます。
の代わりに任意の9個の印刷可能なASCII文字を使用でき
.01234567ます。置換が何であるかを必ず言ってください!改行はそのままにしておく必要があります。
得点
バイト単位の最短コードが優先されます。Tiebreakerは、最も投票数の多い投稿です。
この課題は、Minecraftのブロック、スラブ、および階段に触発されたもので、ここで説明したのと同じルールに従います。PPCGとMinecraft を楽しんでいるなら、PPCG Minecraft Serverをチェックアウトすることをお勧めします。