前書き
パズルのルール:
パズル(としても知られているバイナリTakuzuまたはSubikuは)理解することは非常に簡単で、かつ唯一のいくつかのルールがあります。
ゲームの名前はバイナリであるので、それはかなり明白だが、あなただけの0と1を記入することができます。
- 同じ数字を2つだけ縦または横に互いに隣接させることができます
- 各行と各列には、等しい量のゼロと1が含まれている必要があります(これは暗黙的に、すべてのバイナリゲームが常に偶数次元を持つことを意味します)。
- 行と列が重複していない場合があります(ゼロと1の順序がまったく同じ)。
必要に応じて、www.binarypuzzle.comでゲームをプレイできます。
戦術:
ルール1により、次の場合は常に数字を入力できます。-
同じ数字が2つ縦または横にすでに隣接している場合、両側で反対の数字を入力できます。すなわち.11...
→ 0110..
。
-縦または横に同じ数字が2つあり、その間に1つのギャップしかない。すなわち.1.1..
→.101..
ルール1により、3つのギャップが残っており、同じ数字を3つ隣接させることができない場合、ギャップの1つを埋めることができます。すなわち.0.1.0
→ 10.1.0
(まだ2つ入力する必要があり、3つの隣接するものを中央に配置することはできないため、最初のギャップはでなければなりません1
。)
ルール2により、行または列の残りのギャップの半分がすでに反対の桁で埋められている場合は、常に残りのギャップを埋めることができます。すなわち.1.011
→010011
規則3により、同じ順序の行を解くために2つだけ残っている場合は、常に反対の数字を埋めることができます。すなわち101100 & 1..100
→101100 & 110100
ルール3により、3つのギャップが同じ順序の線上に残っている場合、ギャップを埋めることができます。すなわち010011 & .1.01.
→ 010011 & .1.010
(1
最後にaを入力することはできません。これは、他の2つのギャップにゼロを入力し、両方の行を順番に等しくする必要があるためです。)
例:
いくつかの1と0が埋められた次の6x6グリッドから始めます(ドットはまだ埋めていないギャップです):
.1....
.10.0.
1.11..
.1....
...1.0
......
ルール1および2により、次の数字を入力できます。
.1.01.
.1010.
101100
010011
.0.1.0
.010..
ルール1により、行5、列1に1を入力できます。
.1.01.
.1010.
101100
010011
10.1.0
.010..
ルール3により、行1、列6に0を入力できます(行4を見た場合):
.1.010
.1010.
101100
010011
10.1.0
.010..
これで、ルール1と2により、ギャップを数字で埋め続けることができます。
.1.010
010101
101100
010011
10.1.0
.010.1
これで、ルール3(行3を見たとき)のために行5を終了できます。
.1.010
010101
101100
010011
100110
.010.1
そして、ルール1と2によってパズルを完成させることができます。
011010
010101
101100
010011
100110
101001
チャレンジ:
課題は簡単です。開始グリッドを指定して、解決したパズルを出力します。
注:上記のルールを実装する必要はありません。もちろん可能であり、この課題を実装する方法についてのヒントが得られるはずですが、ルールを考慮してソリューションをブルートフォースすることは完全に問題ありません。
どのように解決するかはあなた次第ですが、課題は解決したパズルを出力することです。
チャレンジルール:
- グリッドの入出力フォーマットは柔軟ですが、使用するものを明記してください。(つまり、2Dバイト配列、改行付きの文字列など)
- これは、使用される文字にも当てはまります。例ではを使用しました
01.
が、必要に応じてABx
代わりに使用できます。使用した入出力形式と文字を記入してください。 - 次のグリッドサイズのみが使用されると想定でき
6x6
ます。8x8
;10x10
;12x12
;14x14
;16x16
。
一般的なルール:
- これはcode-golfなので、バイト単位の最短の回答が優先されます。
コードゴルフ言語では、コードゴルフ言語以外の言語で回答を投稿しないようにしないでください。「あらゆる」プログラミング言語について、可能な限り短い答えを考え出すようにしてください。 - 回答には標準ルールが適用されるため、STDIN / STDOUT、関数/メソッド、適切なパラメーター、完全なプログラムを使用できます。あなたの電話。
- デフォルトの抜け穴は禁止されています。
- 可能であれば、コードのテストを含むリンクを追加してください。
- また、必要に応じて説明を追加してください。
テストケース:
ドットは読みやすさのためにのみ追加されています。代わりに、スペースなど、ギャップに使用したいものを自由に使用してください。入力形式と出力形式の両方に柔軟性があります。
Input:
1..0..
..00.1
.00..1
......
00.1..
.1..00
Output:
101010
010011
100101
011010
001101
110100
Input:
.1....
.10.0.
1.11..
.1....
...1.0
......
Output:
011010
010101
101100
010011
100110
101001
Input:
.......1..
.00..0..1.
.0..1..0.0
..1...1...
1.1......1
.......1..
.0..1...0.
....11...0
.0.0..1..0
0...0...1.
Output:
0110010101
1001100110
1001101010
0110011001
1010100101
0101010110
1001101001
0110110100
1010011010
0101001011