Головоломка зверху на лицьовій стороні - це головоломка, де потрібно створити 3-D форму (як правило, кубічних) блоків з трьома ортогональними видами: вид зверху, вид спереду та вид збоку.
Наприклад, подано вид зверху, спереду та збоку таким чином:
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 . .
. . . . . . . . . . . .
Якщо вигляд зверху говорить, що блок знаходиться зліва зліва, немає способу, який може відповідати виду спереду, який говорить, що блок повинен бути третім зліва. Тож ця домовленість неможлива.
Ваше завдання - створити програму, яка, задаючи довільну головоломку 4х4 зверху спереду, намагається вирішити її в найменшій кількості кубів або оголошує її нерозв'язною.
Ваша програма прийме як вхід серію з 48 біт, представляючи вигляд зверху, спереду та збоку. Вони можуть бути в будь-якому бажаному форматі (6-байтовий рядок, рядок 0 і 1, 12-значний шістнадцятковий номер тощо), але порядок бітів повинен відображатись таким чином:
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
Іншими словами, біти йдуть у лівому та правому порядку, зверху вниз, згори, потім спереду, потім вид збоку.
Тоді ваша програма виведе або серію з 64 біт, що вказують на куби в сітці 4x4x4, які заповнені, або вказують на те, що сітка нерозв'язна.
Ваша програма буде оцінена за допомогою батареї в 1 000 000 тестових випадків.
Дані тесту будуть генеровані, приймаючи хеші MD5 цілих чисел "000000" до "999999" як рядки, витягуючи перші 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
Перші два є нерозв'язними, тоді як останній має рішення з наступними шарами, спереду до спини:
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.
Оцінка вашої програми визначатиметься за наступними критеріями у порядку зменшення пріоритетності:
- Найбільша кількість вирішених справ.
- Найменша кількість блоків, необхідних для вирішення цих випадків.
- Найкоротший код у байтах.
Ви повинні подати та обчислити бал самостійно, що вимагає, щоб ваша програма змогла пройти всі 1000000 тестових випадків.