Nonogram Hub
Nonogram Hub

Sådan laver vi vores nonogrammer

Hvert puslespil her begynder som et almindeligt billede og ender som et gitter, du kan løse med ren logik. Undervejs går det gennem en automatiseret pipeline, der rasteriserer billedet, tester, om resultatet faktisk kan løses, og kasserer dem, der ikke kan. Denne side gennemgår ærligt den proces — inklusive de dele, der fejler, for det meste af arbejdet ligger i at forkaste dårlige puslespil frem for at lave gode.

1. Det begynder med et billede

Et nonogram er altid bare en sort-hvid silhuet — ingen skygge, ingen farve, ingen indre detaljer. Så det første trin er at vælge et kildebillede, hvis form læses tydeligt ved en lillebitte opløsning: et dyr, en frugt, et stjernetegn, en husholdningsgenstand. Vi arbejder ud fra vektorgrafik (SVG), transparente PNG'er og almindelige fotos, organiseret i temabaserede ressourcepakker, plus billeder hentet ind via en billedsøgning i appen.

Det, der tæller på dette stadie, er ikke, hvor pænt billedet er — det er, hvor godt dets omrids overlever at blive presset ned til et 15×15- eller 20×20-gitter. En kraftig, veladskilt form fungerer. En rodet scene med mange små overlappende dele gør det næsten aldrig, og vi skal se hvorfor nedenfor.

2. At gøre et billede til et gitter

Billedet rasteriseres med et rigtigt billedbibliotek (det samme, som browsere læner sig op ad ved SVG), og reduceres derefter til én enkelt sort-eller-hvid-værdi pr. celle. Der er ikke én enkelt „rigtig“ måde at gøre det på, så pipelinen prøver flere: ud fra billedets egen gennemsigtighed, hvor det har nogen, ud fra ren lysstyrke (mørkt = udfyldt) eller — for et lyst, farverigt motiv på en ensfarvet baggrund, hvor lysstyrke alene knap nok adskiller det — ud fra farveafstand fra baggrunden. En lyseorange ræv på hvidt er næsten hvid i lysstyrke, men langt fra det i farve; farveafstandsmasken isolerer den rent.

Grænsen mellem „udfyldt“ og „tom“ vælges automatisk ved hjælp af Otsus metode (Otsu's method), en standardteknik, der finder den lysstyrketærskel, som deler billedet renest i to grupper. Da det er umuligt at vide på forhånd, hvilken størrelse, beskæring og tærskel der læses bedst, genererer pipelinen mange kandidatgitre pr. billede — forskellige størrelser, forskellige tærskler — beskærer hvert til dets udfyldte indhold og tilpasser formen til gitterets proportioner, så en bred krone får et bredt gitter i stedet for at blive klemt ind i et kvadrat.

3. At kontrollere, at det faktisk kan løses

Et billede, der ser fint ud for et menneske, er ikke automatisk et gyldigt puslespil. Et rigtigt nonogram skal kunne løses ud fra sine række- og kolonneledetråde alene og — afgørende — skal have præcis én løsning. Hvis to forskellige udfyldte mønstre begge opfylder hver ledetråd, er puslespillet tvetydigt og uretfærdigt, fordi en løser, der følger ren logik, korrekt kunne ende med det „forkerte“ billede.

Så hver kandidat føres til en løser: den anvender de samme linje-for-linje-slutninger, som en person ville, og hvor logikken alene går i stå, falder den tilbage på en udtømmende søgning for at tælle, hvor mange fuldstændige løsninger der findes. Ethvert gitter med nul løsninger (selvmodsigende) eller mere end én løsning (tvetydigt) forkastes på stedet. Denne entydighedskontrol er den enkeltvigtigste port i hele pipelinen.

4. At sikre, at det er logik, ikke gætteri

At have én løsning er ikke helt nok. Et puslespil kan være teknisk entydigt, men kun nåeligt ved forsøg og fejl — at udfylde en celle, følge den dybt ind i gitteret og bakke tilbage, når den modsiger sig selv. Det er ikke at løse; det er at gætte, og det giver et frustrerende puslespil.

For at fange dette klassificerer vi, hvor svært hvert puslespil er at ræsonnere sig igennem. Puslespil, der følger af ligefrem linje-for-linje-logik, er „enkle“. Et andet, velundersøgt niveau af deduktion (baseret på publiceret forskning i nonogramsværhed af Batenburg and Kosters) klarer det meste af resten uden nogen gætteri. Alt, hvad der stadig ikke kan afgøres uden forsøg og fejl, markeres som gætteri-krævende — og for det daglige katalog lægges de til side i stedet for at blive udgivet.

5. Hvorfor mange billeder aldrig kommer med

Før alt løsningsarbejde forudsiger pipelinen også, om et billede overhovedet er værd at forsøge, ved hjælp af to grove, men ærlige signaler. Det ene er separerbarhed: hvor rent billedet overhovedet deler sig i to toner — en mudret kilde med lav kontrast er et dårligt bud i enhver størrelse. Det andet er en detalje-mod-opløsning-pasform: et billede med langt flere fine træk, end gitteret har celler, kollapser bare til en klat.

Et konkret eksempel fra vores egen testning: et rigtigt foto af Eiffeltårnet gav en 40×40-kandidat, der bestod hver løsbarhedskontrol — én entydig løsning, et rimeligt fyldforhold — men blev gengivet som et massivt rektangel. Tårnets gitterdetalje og rodet under det fladede ud til én udifferentieret blok. Teknisk et gyldigt nonogram; visuelt ubrugeligt. Sådanne tilfælde er præcis, hvad disse forhåndskontroller, plus et menneskeligt blik, er der for at stoppe. For at være klare om grænserne: der er ingen synsmodel her — pipelinen genkender aldrig, *hvad* der er i et billede, den måler kun, hvor godt dets form konverteres. Derfor er den endelige afgørelse stadig en persons.

6. En vurdering og et sidste menneskeligt blik

Puslespil, der klarer hver port, får en sværhedsvurdering ud fra deres løsningsniveau og formstatistik (hvor fyldt gitteret er, om billedet løber ud over kanterne og så videre), hvilket er det, der sorterer dem i lette, mellemsvære og svære samlinger. Derefter åbner en person dem, der er på vej til kataloget, i vores gitterredigering, kontrollerer, at billedet faktisk læses som det, det skal være, og justerer eller kasserer alt, hvad de automatiske kontroller lod slippe igennem, men ikke burde have.

Det er en bevidst uglamourøs proces, og det er netop pointen: automatiseringen findes for at garantere fairness — én løsning, løsbar med logik — mens et menneske vogter over det, en computer ikke kan bedømme, nemlig om det færdige billede er noget værd.

Det er hele pipelinen, minus koden. Hvis du hellere vil løse et end at læse om, hvordan det bygges, er dagens puslespil et godt sted at starte.