Đã đến lúc bắt tay vào một nhiệm vụ nguy hiểm để đánh bại Tình báo Anh. Mục đích của thử thách này là viết mã ngắn nhất sẽ giải được một Nonogram.
Nonogram là gì?
Các quy tắc rất đơn giản. Bạn có một lưới các ô vuông, phải được điền vào màu đen hoặc để trống. Bên cạnh mỗi hàng của lưới được liệt kê độ dài của các ô vuông màu đen trên hàng đó. Trên mỗi cột được liệt kê độ dài của các hình vuông màu đen trong cột đó. Mục đích của bạn là tìm tất cả các hình vuông màu đen. Trong loại câu đố này, các con số là một dạng chụp cắt lớp rời rạc để đo xem có bao nhiêu dòng hình vuông điền vào có trong bất kỳ hàng hoặc cột nào. Ví dụ, một đầu mối của "4 8 3" có nghĩa là có các bộ bốn, tám và ba hình vuông đầy, theo thứ tự đó, với ít nhất một hình vuông trống giữa các nhóm liên tiếp. [ 1 ] [ 2 ]
Vì vậy, giải pháp cho Nonogram ở trên sẽ là:
Chi tiết thực hiện
Bạn có thể chọn đại diện cho Nonogram theo cách bạn muốn và lấy nó làm đầu vào theo bất kỳ cách nào bạn thấy phù hợp với ngôn ngữ của mình. Đầu ra cũng vậy. Mục đích của thử thách này là hoàn thành công việc theo nghĩa đen; nếu bạn có thể giải quyết biểu đồ không với bất kỳ đầu ra nào mà chương trình của bạn đưa ra, điều đó là hợp lệ. Một lưu ý là bạn không thể sử dụng bộ giải trực tuyến :)
Vấn đề này rất khó khăn về mặt thuật toán (np-perfect) ở chỗ không có giải pháp hoàn toàn hiệu quả cho nó và do đó, bạn sẽ không bị phạt vì không thể giải quyết những vấn đề lớn hơn, mặc dù câu trả lời của bạn sẽ được đền đáp rất nhiều nếu đó là có khả năng xử lý các vụ án lớn (xem phần thưởng). Là một điểm chuẩn, giải pháp của tôi hoạt động lên tới khoảng 25x25 trong vòng 5-10 giây. Để cho phép linh hoạt giữa các ngôn ngữ khác nhau, các giải pháp mất ít hơn 5 phút cho một biểu đồ không có kích thước 25x25 là đủ tốt.
Bạn có thể giả sử một câu đố luôn luôn là một phi hình vuông NxN.
Bạn có thể sử dụng nhà sản xuất câu đố phi hình trực tuyến này để kiểm tra các giải pháp của bạn.
Chấm điểm
Tất nhiên, bạn được tự do sử dụng bất kỳ ngôn ngữ nào bạn muốn và vì đây là môn đánh gôn, các mục sẽ được sắp xếp theo thứ tự: accuracy -> length of code -> speed.
Tuy nhiên, đừng nản lòng với các ngôn ngữ chơi gôn, câu trả lời trong tất cả các ngôn ngữ thể hiện nỗ lực chơi gôn một cách thú vị sẽ được nâng cao!
Tiền thưởng
Tôi thực sự đã học về Nonograms từ một tấm thiệp Giáng sinh bằng mật mã do Tình báo Anh phát hành tại đây . Phần đầu tiên về cơ bản là một Nonogram 25x25 đồ sộ. Nếu giải pháp của bạn có thể giải quyết điều này, bạn sẽ nhận được danh tiếng :)
Để làm cho cuộc sống của bạn dễ dàng hơn về mặt nhập dữ liệu, tôi đã cung cấp cách tôi thể hiện dữ liệu cho câu đố cụ thể này để bạn sử dụng miễn phí. 25 dòng đầu tiên là các đầu mối hàng, theo sau là một dòng phân cách '-', theo sau là 25 dòng của các đầu mối col, theo sau là một dòng phân cách '#', và sau đó là một đại diện của lưới với các đầu mối vuông được điền vào.
7 3 1 1 7
1 1 2 2 1 1
1 3 1 3 1 1 3 1
1 3 1 1 6 1 3 1
1 3 1 5 2 1 3 1
1 1 2 1 1
7 1 1 1 1 1 7
3 3
1 2 3 1 1 3 1 1 2
1 1 3 2 1 1
4 1 4 2 1 2
1 1 1 1 1 4 1 3
2 1 1 1 2 5
3 2 2 6 3 1
1 9 1 1 2 1
2 1 2 2 3 1
3 1 1 1 1 5 1
1 2 2 5
7 1 2 1 1 1 3
1 1 2 1 2 2 1
1 3 1 4 5 1
1 3 1 3 10 2
1 3 1 1 6 6
1 1 2 1 1 2
7 2 1 2 5
-
7 2 1 1 7
1 1 2 2 1 1
1 3 1 3 1 3 1 3 1
1 3 1 1 5 1 3 1
1 3 1 1 4 1 3 1
1 1 1 2 1 1
7 1 1 1 1 1 7
1 1 3
2 1 2 1 8 2 1
2 2 1 2 1 1 1 2
1 7 3 2 1
1 2 3 1 1 1 1 1
4 1 1 2 6
3 3 1 1 1 3 1
1 2 5 2 2
2 2 1 1 1 1 1 2 1
1 3 3 2 1 8 1
6 2 1
7 1 4 1 1 3
1 1 1 1 4
1 3 1 3 7 1
1 3 1 1 1 2 1 1 4
1 3 1 4 3 3
1 1 2 2 2 6 1
7 1 3 2 1 1
#
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Và đây là một phiên bản hơi khác nhau để thuận tiện cho bạn; một tuple được phân tách bằng dấu phẩy (hàng, col) trong đó mỗi phần tử là danh sách các danh sách.
([[7, 3, 1, 1, 7],
[1, 1, 2, 2, 1, 1],
[1, 3, 1, 3, 1, 1, 3, 1],
[1, 3, 1, 1, 6, 1, 3, 1],
[1, 3, 1, 5, 2, 1, 3, 1],
[1, 1, 2, 1, 1],
[7, 1, 1, 1, 1, 1, 7],
[3, 3],
[1, 2, 3, 1, 1, 3, 1, 1, 2],
[1, 1, 3, 2, 1, 1],
[4, 1, 4, 2, 1, 2],
[1, 1, 1, 1, 1, 4, 1, 3],
[2, 1, 1, 1, 2, 5],
[3, 2, 2, 6, 3, 1],
[1, 9, 1, 1, 2, 1],
[2, 1, 2, 2, 3, 1],
[3, 1, 1, 1, 1, 5, 1],
[1, 2, 2, 5],
[7, 1, 2, 1, 1, 1, 3],
[1, 1, 2, 1, 2, 2, 1],
[1, 3, 1, 4, 5, 1],
[1, 3, 1, 3, 10, 2],
[1, 3, 1, 1, 6, 6],
[1, 1, 2, 1, 1, 2],
[7, 2, 1, 2, 5]],
[[7, 2, 1, 1, 7],
[1, 1, 2, 2, 1, 1],
[1, 3, 1, 3, 1, 3, 1, 3, 1],
[1, 3, 1, 1, 5, 1, 3, 1],
[1, 3, 1, 1, 4, 1, 3, 1],
[1, 1, 1, 2, 1, 1],
[7, 1, 1, 1, 1, 1, 7],
[1, 1, 3],
[2, 1, 2, 1, 8, 2, 1],
[2, 2, 1, 2, 1, 1, 1, 2],
[1, 7, 3, 2, 1],
[1, 2, 3, 1, 1, 1, 1, 1],
[4, 1, 1, 2, 6],
[3, 3, 1, 1, 1, 3, 1],
[1, 2, 5, 2, 2],
[2, 2, 1, 1, 1, 1, 1, 2, 1],
[1, 3, 3, 2, 1, 8, 1],
[6, 2, 1],
[7, 1, 4, 1, 1, 3],
[1, 1, 1, 1, 4],
[1, 3, 1, 3, 7, 1],
[1, 3, 1, 1, 1, 2, 1, 1, 4],
[1, 3, 1, 4, 3, 3],
[1, 1, 2, 2, 2, 6, 1],
[7, 1, 3, 2, 1, 1]])
s=[].fill([].fill(0,0,25),0,25);s[3][3]=s[3][4]=s3[3][12]=s3[3][13]=s3[3][21]=s[8][6]=s[8][7]=s[8][10]=s[8][14]=s[8][15]=s[8][18]=s[16][6]=s[16][11]=s[16][16]=s[16][20]=s[21][3]=s[21][4]=s[21][9]=s[21][10]=s[21][15]=s[21][20]=s[21][21]=1;