Câu đố mặt trước là một câu đố trong đó bạn được yêu cầu xây dựng hình dạng 3 chiều của các khối (thường là khối) với ba góc nhìn trực giao: góc nhìn từ trên xuống, mặt trước và mặt bên.
Ví dụ: được cung cấp chế độ xem trên cùng, phía trước và bên như sau:
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.
Một khối lập phương 2x2x2 (với tập 8) sẽ thỏa mãn giải pháp này, nhưng nó có thể thực hiện được trong tập 4, nếu chúng ta có cấu trúc lớp sau:
. . . . . . . .
. x . . . . x .
. . x . . x . .
. . . . . . . .
Ngoài ra còn có một số sắp xếp không thể giải quyết. Lấy ví dụ:
Top: Front: Side:
. . . . . . . . . . . .
. . . . . . x . . . . .
. x . . . . . . . x . .
. . . . . . . . . . . .
Nếu chế độ xem trên cùng cho biết khối này đứng thứ hai từ bên trái, thì không có cách nào có thể khớp với chế độ xem trước cho biết khối phải đứng thứ ba từ bên trái. Vì vậy, sự sắp xếp này là không thể.
Nhiệm vụ của bạn là xây dựng một chương trình, đưa ra một câu đố trên mặt trước tùy ý 4 x 4, cố gắng giải nó trong một số ít hình khối nhất, hoặc tuyên bố nó không thể giải được.
Chương trình của bạn sẽ lấy đầu vào là một chuỗi 48 bit, đại diện cho các khung nhìn trên cùng, phía trước và bên. Chúng có thể ở bất kỳ định dạng nào bạn muốn (chuỗi 6 byte, chuỗi 0 và 1, số hex 12 chữ số, v.v.), nhưng thứ tự của các bit phải ánh xạ như sau:
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
Nói cách khác, các bit đi theo thứ tự từ trái sang phải, từ trên xuống dưới, ở trên cùng, sau đó trước, sau đó xem bên.
Chương trình của bạn sau đó sẽ xuất ra một chuỗi 64 bit cho biết các hình khối trong lưới 4x4x4 được điền vào hoặc chỉ ra rằng lưới không thể giải được.
Chương trình của bạn sẽ được ghi điểm bằng cách chạy pin 1.000.000 trường hợp thử nghiệm.
Dữ liệu thử nghiệm sẽ được tạo bằng cách lấy các giá trị băm MD5 của các số nguyên "000000" đến "999999" làm chuỗi, trích xuất 48 bit đầu tiên (12 hình lục giác) của mỗi băm này và sử dụng chúng làm đầu vào cho mặt trước trên cùng câu đố bên. Ví dụ, đây là một số đầu vào kiểm tra và các câu đố mà chúng tạo ra:
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
Hai cái đầu tiên không thể giải quyết được, trong khi cái cuối cùng có một giải pháp với các lớp sau, từ trước ra sau:
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.
Điểm số của chương trình của bạn sẽ được xác định theo các tiêu chí sau, theo thứ tự ưu tiên giảm dần:
- Số lượng các trường hợp được giải quyết cao nhất.
- Số khối thấp nhất cần thiết để giải quyết các trường hợp đó.
- Mã ngắn nhất tính bằng byte.
Bạn phải tự mình nộp và tính điểm, điều này đòi hỏi chương trình của bạn phải có khả năng chạy qua tất cả 1.000.000 trường hợp kiểm tra.