윗면 퍼즐은 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 . .
. . . . . . . . . . . .
상단 뷰에서 블록이 왼쪽에서 두 번째라고 표시되면 블록이 왼쪽에서 세 번째 여야한다는 전면 뷰와 일치하는 방법이 없습니다. 따라서이 배열은 불가능합니다.
당신의 임무는 임의의 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
처음 두 개는 해결할 수 없지만 마지막 두 개는 앞뒤로 다음 레이어가있는 솔루션을 가지고 있습니다.
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 개의 모든 테스트 사례를 실행할 수 있어야 점수를 직접 제출하고 계산해야합니다.