Cách chúng tôi tạo ra nonogram
Mỗi câu đố ở đây khởi đầu là một bức ảnh bình thường và kết thúc là một lưới ô mà bạn có thể giải chỉ bằng logic. Ở giữa, nó đi qua một quy trình tự động: raster hóa hình ảnh, kiểm tra xem kết quả có thực sự giải được hay không, và loại bỏ những cái không giải được. Trang này đi qua quy trình đó một cách trung thực — bao gồm cả những phần thất bại, bởi phần lớn công việc nằm ở việc loại bỏ những câu đố dở hơn là tạo ra những câu đố hay.
1. Bắt đầu từ một hình ảnh
Một nonogram luôn chỉ là một hình bóng đen trắng — không đổ bóng, không màu sắc, không chi tiết bên trong. Vì vậy bước đầu tiên là chọn một hình ảnh nguồn có hình dạng đọc được rõ ràng ở độ phân giải rất nhỏ: một con vật, một loại trái cây, một biểu tượng cung hoàng đạo, một vật dụng gia đình. Chúng tôi làm việc từ tranh vector (SVG), PNG trong suốt và ảnh chụp thông thường, được tổ chức thành các gói tài nguyên theo chủ đề, cùng với những hình ảnh được lấy vào qua chức năng tìm kiếm hình ảnh trong ứng dụng.
Điều quan trọng ở giai đoạn này không phải là hình ảnh đẹp đến đâu — mà là đường viền của nó chịu đựng tốt ra sao khi bị nén xuống một lưới 15×15 hoặc 20×20. Một hình dạng đậm nét, tách bạch rõ ràng thì hiệu quả. Một cảnh rối rắm với nhiều phần nhỏ chồng chéo thì hầu như không bao giờ hiệu quả, và chúng ta sẽ thấy vì sao ở phần dưới.
2. Biến một hình ảnh thành lưới ô
Hình ảnh được raster hóa bằng một thư viện xử lý ảnh thực thụ (chính thư viện mà các trình duyệt dựa vào để xử lý SVG), rồi được rút gọn thành một giá trị đen-hoặc-trắng duy nhất cho mỗi ô. Không có một cách «đúng» duy nhất để làm điều đó, nên quy trình thử một vài cách: dựa vào độ trong suốt vốn có của hình ảnh ở nơi nó có, dựa vào độ sáng đơn thuần (tối = tô), hoặc — với một chủ thể tươi sáng, nhiều màu trên nền trơn, nơi mà chỉ riêng độ sáng gần như không tách được nó ra — dựa vào khoảng cách màu so với nền. Một con cáo màu cam nhạt trên nền trắng gần như là trắng về độ sáng, nhưng cách xa nền về màu sắc; mặt nạ khoảng cách màu tách riêng nó ra một cách gọn gàng.
Ranh giới giữa «tô» và «trống» được chọn tự động bằng Otsu's method, một kỹ thuật tiêu chuẩn tìm ra ngưỡng độ sáng chia hình ảnh thành hai nhóm một cách sạch sẽ nhất. Vì không có cách nào biết trước kích thước, cách cắt và ngưỡng nào sẽ đọc ra rõ nhất, quy trình tạo ra nhiều lưới ứng viên cho mỗi hình ảnh — kích thước khác nhau, ngưỡng khác nhau — cắt mỗi lưới xuống đúng phần nội dung được tô của nó và khớp hình dạng với tỷ lệ của lưới, để một chiếc vương miện rộng có được một lưới rộng thay vì bị ép vào một hình vuông.
3. Kiểm tra xem nó có thực sự giải được không
Một hình ảnh trông ổn với con người không tự động là một câu đố hợp lệ. Một nonogram thực thụ phải giải được chỉ từ các gợi ý hàng và cột của nó và — điều then chốt — phải có đúng một lời giải. Nếu hai mẫu tô khác nhau đều thỏa mãn mọi gợi ý, câu đố là mơ hồ và không công bằng, bởi một người giải theo logic thuần túy có thể đi đến bức tranh «sai» một cách hoàn toàn đúng đắn.
Vì vậy mỗi ứng viên được đưa vào một bộ giải: nó áp dụng chính những suy luận từng-dòng-một mà một người sẽ làm, và ở nơi chỉ riêng logic bị bế tắc, nó lùi về một cuộc tìm kiếm vét cạn để đếm xem có bao nhiêu lời giải trọn vẹn tồn tại. Bất kỳ lưới nào có không lời giải (mâu thuẫn) hoặc nhiều hơn một lời giải (mơ hồ) đều bị loại ngay lập tức. Việc kiểm tra tính duy nhất này là cửa ải quan trọng nhất trong toàn bộ quy trình.
4. Bảo đảm đó là logic, chứ không phải đoán mò
Có một lời giải vẫn chưa hẳn là đủ. Một câu đố có thể duy nhất về mặt kỹ thuật nhưng chỉ đến được bằng thử-và-sai — tô một ô, lần theo nó sâu vào trong lưới, rồi quay lui khi nó mâu thuẫn. Đó không phải là giải; đó là đoán mò, và nó tạo ra một câu đố gây bực bội.
Để bắt được điều này, chúng tôi phân loại mức độ khó suy luận của mỗi câu đố. Những câu đố tự lộ ra từ logic từng-dòng-một thẳng thắn là «đơn giản». Một tầng suy diễn thứ hai đã được nghiên cứu kỹ (dựa trên nghiên cứu đã công bố về độ khó của nonogram bởi Batenburg and Kosters) xử lý phần lớn số còn lại mà không cần đoán mò gì cả. Bất cứ điều gì vẫn không thể ngã ngũ nếu không thử-và-sai đều bị đánh dấu là cần-đoán-mò — và với danh mục thường nhật, những cái đó bị gạt sang một bên thay vì đăng lên.
5. Vì sao nhiều hình ảnh chẳng bao giờ được chọn
Trước bất kỳ công việc giải nào, quy trình cũng dự đoán liệu một hình ảnh có đáng để thử hay không, bằng hai tín hiệu thô nhưng trung thực. Một là tính tách biệt: hình ảnh chia thành hai tông màu sạch sẽ đến đâu — một nguồn đục và tương phản thấp là một canh bạc tồi ở bất kỳ kích thước nào. Cái còn lại là sự tương thích giữa chi tiết và độ phân giải: một hình ảnh có nhiều đặc điểm tinh vi hơn hẳn số ô mà lưới có sẽ chỉ đổ sụp thành một vệt lem.
Một ví dụ cụ thể từ chính quá trình thử nghiệm của chúng tôi: một bức ảnh thật của tháp Eiffel cho ra một ứng viên 40×40 vượt qua mọi lần kiểm tra tính giải được — một lời giải duy nhất, một tỷ lệ tô hợp lý — nhưng lại hiện ra như một hình chữ nhật đặc. Chi tiết mắt lưới của tháp và mớ lộn xộn bên dưới nó bị làm phẳng thành một khối không phân biệt được. Về mặt kỹ thuật là một nonogram hợp lệ; nhưng về mặt thị giác thì vô dụng. Những trường hợp như thế chính là điều mà các kiểm tra sơ bộ này, cộng với một cái liếc mắt của con người, hiện diện để chặn lại. Nói cho rõ về giới hạn: ở đây không có mô hình thị giác nào — quy trình chẳng bao giờ nhận ra *cái gì* có trong một bức ảnh, mà chỉ đo hình dạng của nó chuyển đổi tốt đến đâu. Đó là lý do quyết định cuối cùng vẫn thuộc về một con người.
6. Một xếp hạng, và một cái nhìn cuối cùng của con người
Những câu đố vượt qua mọi cửa ải nhận một xếp hạng độ khó từ tầng giải của chúng và các thống kê về hình dạng (lưới được tô đầy đến đâu, bức tranh có tràn ra khỏi mép hay không, v.v.), và đó là điều phân loại chúng vào các bộ sưu tập dễ, trung bình và khó. Sau đó một người mở những cái sắp vào danh mục trong trình chỉnh sửa lưới của chúng tôi, kiểm tra xem bức tranh có thực sự đọc ra đúng cái mà nó phải là hay không, và điều chỉnh hoặc loại bỏ bất cứ thứ gì mà các kiểm tra tự động đã cho qua nhưng lẽ ra không nên.
Đó là một quy trình cố tình không hào nhoáng, và đó chính là điểm mấu chốt: sự tự động hóa tồn tại để bảo đảm tính công bằng — một lời giải, giải được bằng logic — trong khi một con người canh giữ điều mà máy tính không thể phán xét, đó là liệu bức tranh hoàn thiện có hay hay không.
Đó là toàn bộ quy trình, trừ phần mã. Nếu bạn thích giải một câu hơn là đọc về cách nó được xây dựng, câu đố hôm nay là một nơi tốt để bắt đầu.
