Cum ne creăm nonogramele
Fiecare puzzle de aici începe ca o imagine obișnuită și se termină ca o grilă pe care o poți rezolva doar cu logică. Între timp, trece printr-un flux automatizat care rasterizează imaginea, testează dacă rezultatul este cu adevărat rezolvabil și le aruncă pe cele care nu sunt. Această pagină parcurge acel proces în mod sincer — inclusiv părțile care eșuează, deoarece cea mai mare parte a muncii constă în respingerea puzzle-urilor proaste, mai degrabă decât în crearea celor bune.
1. Începe cu o imagine
O nonogramă este întotdeauna doar o siluetă alb-negru — fără umbre, fără culoare, fără detalii interioare. Așadar, primul pas este alegerea unei imagini sursă a cărei formă se citește clar la o rezoluție minusculă: un animal, un fruct, un semn zodiacal, un obiect casnic. Lucrăm cu grafică vectorială (SVG), PNG-uri transparente și fotografii simple, organizate în pachete de resurse tematice, plus imagini aduse printr-o căutare de imagini în aplicație.
Ceea ce contează în această etapă nu este cât de frumoasă este imaginea — ci cât de bine îi supraviețuiește conturul atunci când este strivit într-o grilă de 15×15 sau 20×20. O formă îndrăzneață, bine separată funcționează. O scenă aglomerată cu multe piese mici suprapuse aproape niciodată, și vom vedea mai jos de ce.
2. Transformarea unei imagini într-o grilă
Imaginea este rasterizată cu o bibliotecă de imagini reală (aceeași pe care browserele se bazează pentru SVG), apoi redusă la o singură valoare alb-sau-negru per celulă. Nu există o singură modalitate „corectă” de a face acest lucru, așa că fluxul încearcă mai multe: bazându-se pe propria transparență a imaginii acolo unde o are, pe simpla luminozitate (întunecat = umplut) sau — pentru un subiect luminos, colorat pe un fundal simplu, unde luminozitatea singură abia îl separă — pe distanța de culoare față de fundal. O vulpe portocalie deschis pe alb este aproape albă ca luminozitate, dar departe de aceasta ca și culoare; masca de distanță de culoare o izolează curat.
Pragul dintre „umplut” și „gol” este ales automat folosind Otsu's method, o tehnică standard care găsește pragul de luminozitate care împarte imaginea cel mai curat în două grupuri. Deoarece nu există nicio modalitate de a ști dinainte ce dimensiune, decupaj și prag se vor citi cel mai bine, fluxul generează multe grile candidate per imagine — dimensiuni diferite, praguri diferite — decupează fiecare la conținutul său umplut și potrivește forma la proporțiile grilei, astfel încât o coroană lată să primească o grilă lată în loc să fie strivită într-un pătrat.
3. Verificarea că poate fi cu adevărat rezolvată
O imagine care îi pare bună unui om nu este automat un puzzle valid. O nonogramă adevărată trebuie să fie rezolvabilă doar din indiciile rândurilor și coloanelor sale și — esențial — trebuie să aibă exact o soluție. Dacă două modele umplute diferite satisfac fiecare indiciu, puzzle-ul este ambiguu și nedrept, deoarece cineva care îl rezolvă urmând pura logică ar putea ajunge corect la imaginea „greșită”.
Așadar, fiecare candidat este dat unui rezolvator: acesta aplică aceleași deducții rând cu rând pe care le-ar face o persoană, iar acolo unde logica singură se blochează, recurge la o căutare exhaustivă pentru a număra câte soluții complete există. Orice grilă cu zero soluții (contradictorie) sau cu mai mult de o soluție (ambiguă) este respinsă pe loc. Această verificare a unicității este cea mai importantă poartă din întregul flux.
4. Asigurarea că este logică, nu ghicire
Faptul de a avea o singură soluție nu este chiar suficient. Un puzzle poate fi tehnic unic, dar accesibil doar prin încercare și eroare — umplerea unei celule, urmărirea ei adânc în grilă și revenirea când intră în contradicție. Aceasta nu este rezolvare; este ghicire, și face un puzzle frustrant.
Pentru a prinde acest lucru, clasificăm cât de greu este de raționat fiecare puzzle. Puzzle-urile care rezultă dintr-o logică directă rând cu rând sunt „simple”. Un al doilea nivel de deducție, bine studiat (bazat pe cercetarea publicată despre dificultatea nonogramelor de Batenburg and Kosters), rezolvă cea mai mare parte a restului fără nicio ghicire. Orice nu poate fi încă stabilit fără încercare și eroare este marcat ca necesitând-ghicire — iar pentru catalogul cotidian, acestea sunt puse deoparte în loc să fie publicate.
5. De ce multe imagini nu ajung niciodată acolo
Înainte de orice muncă de rezolvare, fluxul prezice și dacă o imagine merită măcar încercată, folosind două semnale brute, dar sincere. Unul este separabilitatea: cât de curat se împarte imaginea în două tonuri, în general — o sursă tulbure, cu contrast scăzut, este un pariu prost la orice dimensiune. Celălalt este potrivirea detaliu-versus-rezoluție: o imagine cu mult mai multe trăsături fine decât are grila celule pur și simplu se va prăbuși într-o pată.
Un exemplu concret din propriile noastre teste: o fotografie reală a Turnului Eiffel a produs un candidat de 40×40 care a trecut fiecare verificare de rezolvabilitate — o soluție unică, un raport de umplere rezonabil — dar s-a redat ca un dreptunghi plin. Detaliul zăbrelit al turnului și dezordinea de sub el s-au aplatizat într-un singur bloc nediferențiat. Tehnic o nonogramă validă; vizual inutilă. Cazurile de acest fel sunt exact ceea ce aceste verificări prealabile, plus o privire umană, sunt menite să oprească. Ca să fim clari despre limite: aici nu există niciun model de viziune — fluxul nu recunoaște niciodată *ce* se află într-o imagine, ci doar măsoară cât de bine se convertește forma ei. De aceea decizia finală rămâne tot a unei persoane.
6. O evaluare și o ultimă privire umană
Puzzle-urile care trec de fiecare poartă primesc o evaluare a dificultății din nivelul lor de rezolvare și statisticile de formă (cât de umplută este grila, dacă imaginea iese peste margini și așa mai departe), ceea ce le sortează în colecții ușoare, medii și dificile. Apoi o persoană le deschide pe cele destinate catalogului în editorul nostru de grile, verifică dacă imaginea se citește într-adevăr ca ceea ce ar trebui să fie și ajustează sau elimină orice au lăsat să treacă verificările automate, dar nu ar fi trebuit.
Este un proces intenționat lipsit de strălucire, și tocmai acesta este scopul: automatizarea există pentru a garanta corectitudinea — o soluție, rezolvabilă prin logică — în timp ce un om păzește lucrul pe care un computer nu îl poate judeca, și anume dacă imaginea finită este bună.
Acesta este întregul flux, mai puțin codul. Dacă preferi să rezolvi unul decât să citești despre cum este construit, puzzle-ul de azi este un loc bun de început.
