Como fazemos nossos nonogramas
Cada quebra-cabeça aqui começa como uma imagem comum e termina como uma grade que você pode resolver apenas com lógica. No meio disso, passa por um fluxo de processamento automatizado que rasteriza a imagem, testa se o resultado é realmente solucionável e descarta os que não são. Esta página percorre esse processo com honestidade — incluindo as partes que falham, porque a maior parte do trabalho está em rejeitar quebra-cabeças ruins, e não em fazer bons.
1. Tudo começa com uma imagem
Um nonograma é sempre apenas uma silhueta em preto e branco — sem sombreamento, sem cor, sem detalhes internos. Então o primeiro passo é escolher uma imagem de origem cuja forma se leia com clareza em uma resolução minúscula: um animal, uma fruta, um signo do zodíaco, um objeto doméstico. Trabalhamos com arte vetorial (SVG), PNGs transparentes e fotos comuns, organizados em pacotes temáticos de recursos, além de imagens trazidas por uma busca de imagens integrada ao app.
O que importa nesta etapa não é o quão bonita a imagem é — é o quão bem o seu contorno sobrevive a ser esmagado até uma grade de 15×15 ou 20×20. Uma forma marcante e bem separada funciona. Uma cena carregada com muitas pequenas partes sobrepostas quase nunca funciona, e veremos abaixo por quê.
2. Transformando uma imagem em uma grade
A imagem é rasterizada com uma biblioteca de imagens de verdade (a mesma em que os navegadores se apoiam para SVG) e, em seguida, reduzida a um único valor preto ou branco por célula. Não há uma única maneira "correta" de fazer isso, então o fluxo de processamento tenta várias: baseando-se na própria transparência da imagem onde ela a tem, no simples brilho (escuro = preenchido) ou — para um sujeito claro e colorido sobre um fundo liso, onde o brilho sozinho mal o separa — na distância de cor em relação ao fundo. Uma raposa laranja-clara sobre branco é quase branca em brilho, mas muito distante disso em cor; a máscara de distância de cor a isola com nitidez.
O limite entre "preenchido" e "vazio" é escolhido automaticamente usando Otsu's method, uma técnica padrão que encontra o limiar de brilho que divide a imagem de forma mais limpa em dois grupos. Como não há como saber de antemão qual tamanho, recorte e limiar se lerão melhor, o fluxo de processamento gera muitas grades candidatas por imagem — diferentes tamanhos, diferentes limiares — recorta cada uma ao seu conteúdo preenchido e ajusta a forma às proporções da grade, de modo que uma coroa larga receba uma grade larga em vez de ser espremida em um quadrado.
3. Verificando se ele realmente pode ser resolvido
Uma imagem que parece boa para um humano não é automaticamente um quebra-cabeça válido. Um nonograma de verdade precisa ser solucionável apenas a partir das pistas de suas linhas e colunas e — crucialmente — precisa ter exatamente uma solução. Se dois padrões preenchidos diferentes satisfizerem todas as pistas, o quebra-cabeça é ambíguo e injusto, porque quem o resolve seguindo a lógica pura poderia chegar corretamente à imagem "errada".
Portanto, cada candidato é passado a um solucionador: ele aplica as mesmas deduções linha a linha que uma pessoa faria e, onde a lógica sozinha empaca, recorre a uma busca exaustiva para contar quantas soluções completas existem. Qualquer grade com zero soluções (contraditória) ou mais de uma solução (ambígua) é rejeitada na hora. Essa verificação de unicidade é o portão mais importante de todo o fluxo de processamento.
4. Garantindo que é lógica, não adivinhação
Ter uma solução não é bem o suficiente. Um quebra-cabeça pode ser tecnicamente único, mas alcançável apenas por tentativa e erro — preenchendo uma célula, seguindo-a fundo na grade e retrocedendo quando ela se contradiz. Isso não é resolver; é adivinhar, e resulta em um quebra-cabeça frustrante.
Para detectar isso, classificamos o quão difícil é raciocinar cada quebra-cabeça. Quebra-cabeças que saem de uma lógica direta linha a linha são "simples". Um segundo nível de dedução, bem estudado (baseado na pesquisa publicada sobre a dificuldade de nonogramas de Batenburg and Kosters), lida com a maior parte do restante sem nenhuma adivinhação. Tudo o que ainda não pode ser resolvido sem tentativa e erro é sinalizado como exigindo adivinhação — e para o catálogo do dia a dia, esses são postos de lado em vez de publicados.
5. Por que muitas imagens nunca chegam lá
Antes de qualquer trabalho de resolução, o fluxo de processamento também prevê se uma imagem vale sequer a tentativa, usando dois sinais brutos, mas honestos. Um é a separabilidade: com que nitidez a imagem se divide em dois tons — uma fonte turva e de baixo contraste é uma aposta ruim em qualquer tamanho. O outro é o ajuste entre detalhe e resolução: uma imagem com muito mais características finas do que a grade tem células simplesmente colapsará em um borrão.
Um exemplo concreto dos nossos próprios testes: uma foto real da Torre Eiffel produziu um candidato de 40×40 que passou em todas as verificações de solucionabilidade — uma solução única, uma proporção de preenchimento razoável — mas foi renderizado como um retângulo sólido. O detalhe reticulado da torre e a confusão embaixo dela achataram-se em um único bloco indiferenciado. Tecnicamente um nonograma válido; visualmente inútil. Casos como esse são exatamente o que essas verificações prévias, mais um olhar humano, existem para deter. Para deixar claros os limites: aqui não há modelo de visão — o fluxo de processamento nunca reconhece *o que* há em uma imagem, apenas mede o quão bem a sua forma se converte. É por isso que a decisão final ainda é de uma pessoa.
6. Uma classificação e um último olhar humano
Quebra-cabeças que passam por cada portão recebem uma classificação de dificuldade a partir do seu nível de resolução e das estatísticas de forma (o quão preenchida está a grade, se a imagem ultrapassa as bordas e assim por diante), o que é o que os organiza em coleções fáceis, médias e difíceis. Em seguida, uma pessoa abre no nosso editor de grades os que se destinam ao catálogo, verifica se a imagem realmente se lê como aquilo que deveria ser, e ajusta ou descarta qualquer coisa que as verificações automáticas deixaram passar, mas não deveriam.
É um processo deliberadamente sem glamour, e esse é o ponto: a automação existe para garantir justiça — uma solução, solucionável por lógica — enquanto um humano protege aquilo que um computador não consegue julgar, que é se a imagem finalizada é boa.
Esse é todo o fluxo de processamento, menos o código. Se você prefere resolver um a ler sobre como ele é construído, o quebra-cabeça de hoje é um bom lugar para começar.
