トップフロントサイドパズルは、3つの直交ビュー(上面図、正面図、側面図)が与えられた(通常は立方体)ブロックの3D形状を構築する必要があるパズルです。
たとえば、次のように上面図、正面図、および側面図を指定します。
Top: Front: Side:
. . . . . . . . . . . .
. x x . . x x . . x x .
. x x . . x x . . x x .
. . . . . . . . . . . .
In this problem, the side view is taken from the right.
2x2x2キューブ(ボリューム8)はこのソリューションを満たしますが、次のレイヤー構造があれば、ボリューム4でも実行可能です。
. . . . . . . .
. x . . . . x .
. . x . . x . .
. . . . . . . .
解決不可能な取り決めもあります。例:
Top: Front: Side:
. . . . . . . . . . . .
. . . . . . x . . . . .
. x . . . . . . . x . .
. . . . . . . . . . . .
上面図でブロックが左から2番目であると表示されている場合、ブロックが左から3番目でなければならないという正面図と一致する方法はありません。したがって、この配置は不可能です。
あなたの仕事は、任意の4x4のトップフロントサイドパズルが与えられた場合、それを最小数のキューブで解決しようとするか、解決できないと宣言するプログラムを構築することです。
プログラムは、上面、正面、側面のビューを表す一連の48ビットを入力として受け取ります。任意の形式(6バイトの文字列、0と1の文字列、12桁の16進数など)を使用できますが、ビットの順序は次のようにマッピングする必要があります。
Top: 0x00 Front: 0x10 Side: 0x20
0 1 2 3 0 1 2 3 0 1 2 3
4 5 6 7 4 5 6 7 4 5 6 7
8 9 a b 8 9 a b 8 9 a b
c d e f c d e f c d e f
言い換えると、ビットは左から右、上から下、上、次に正面、側面の順に表示されます。
プログラムは、4x4x4グリッド内の塗りつぶされたキューブを示す一連の64ビットを出力するか、グリッドが解決できないことを示します。
プログラムは、1,000,000のテストケースのバッテリーを実行することで採点されます。
テストデータは、整数 "000000"から "999999"のMD5ハッシュを文字列として取得し、これらの各ハッシュの最初の48ビット(12ヘキシット)を抽出し、それらをトップフロントの入力として使用して生成されます。サイドパズル。例として、テスト入力とそれらが生成するパズルの一部を次に示します。
Puzzle seed: 000000 hash: 670b14728ad9
Top: Front: Side:
. x x . . . . x x . . .
x x x x . x . x x . x .
. . . . . x x x x x . x
x . x x . . x . x . . x
Puzzle seed: 000001 hash: 04fc711301f3
Top: Front: Side:
. . . . . x x x . . . .
. x . . . . . x . . . x
x x x x . . . x x x x x
x x . . . . x x . . x x
Puzzle seed: 000157 hash: fe88e8f9b499
Top: Front: Side:
x x x x x x x . x . x x
x x x . x . . . . x . .
x . . . x x x x x . . x
x . . . x . . x x . . x
最初の2つは解決できませんが、最後の1つは前から後ろに次のレイヤーのソリューションがあります。
x . . . . . . . x x x . x x x .
. . . . x . . . . . . . . . . .
x . . . . . . . . . . . x x x x
x . . . . . . . . . . . x . . x
There are a total of 16 blocks here, but it can probably be done in less.
プログラムのスコアは、優先度の高い順に、次の基準によって決定されます。
- 解決されたケースの最大数。
- これらのケースを解決するために必要なブロックの最小数。
- バイト単位の最短コード。
自分でスコアを送信して計算する必要があります。これには、プログラムが1,000,000件すべてのテストケースを実行できる必要があります。