Układanka z przodu z przodu to układanka, w której musisz zbudować trójwymiarowy (zwykle sześcienny) blok z trzema prostopadłymi widokami: widokiem z góry, widokiem z przodu i widokiem z boku.
Na przykład, biorąc pod uwagę widok z góry, z przodu i z boku w następujący sposób:
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.
Kostka 2x2x2 (z tomem 8) spełniałaby to rozwiązanie, ale jest wykonalna w tomie 4, jeśli mamy następującą strukturę warstw:
. . . . . . . .
. x . . . . x .
. . x . . x . .
. . . . . . . .
Istnieją również pewne nierozwiązywalne ustalenia. Weź na przykład:
Top: Front: Side:
. . . . . . . . . . . .
. . . . . . x . . . . .
. x . . . . . . . x . .
. . . . . . . . . . . .
Jeśli widok z góry mówi, że blok jest drugi od lewej, nie ma sposobu, aby dopasować się do widoku z przodu, który mówi, że blok musi być trzeci od lewej. Więc to ustawienie jest niemożliwe.
Twoim zadaniem jest zbudowanie programu, który, biorąc pod uwagę dowolną układankę 4x4 od góry, próbuje rozwiązać go w jak najmniejszej liczbie kostek lub ogłasza, że jest nierozwiązywalny.
Twój program pobierze jako ciąg 48 bitów reprezentujących widoki z góry, z przodu i z boku. Mogą być w dowolnym formacie (ciąg 6-bajtowy, ciąg zer i jedynek, 12-cyfrowy numer szesnastkowy itp.), Ale kolejność bitów musi być odwzorowana jako taka:
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
Innymi słowy, bity są ułożone od lewej do prawej, od góry do dołu, w widoku od góry, od przodu, a następnie z boku.
Twój program wyświetli wtedy albo serię 64 bitów, wskazując wypełnione kostki w siatce 4x4x4, albo wskaże, że siatka jest nierozwiązywalna.
Twój program zostanie oceniony przez uruchomienie baterii 1 000 000 przypadków testowych.
Dane testowe zostaną wygenerowane przez wzięcie skrótów MD5 liczb całkowitych od „000000” do „999999” jako ciągów, wyodrębnienie pierwszych 48 bitów (12 heksów) każdego z tych skrótów i wykorzystanie ich jako danych wejściowych dla górnego-przedniego- układanka boczna. Oto przykładowe dane wejściowe testowe i generowane przez nich zagadki:
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
Pierwsze dwa są nierozwiązywalne, podczas gdy ostatni ma rozwiązanie z następującymi warstwami, od przodu do tyłu:
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.
Wynik Twojego programu zostanie określony na podstawie następujących kryteriów, w malejącej kolejności priorytetów:
- Największa liczba rozwiązanych przypadków.
- Najmniejsza liczba bloków wymagana do rozwiązania tych przypadków.
- Najkrótszy kod w bajtach.
Musisz przesłać i obliczyć wynik samodzielnie, co wymaga, aby Twój program mógł przejść przez wszystkie 1 000 000 przypadków testowych.