Validar tabuleiro de sudoku: linhas, colunas e blocos
Uma posição de Sudoku pode parecer aceitável e ainda conter uma contradição que torna inútil qualquer tentativa posterior de resolvê-la.
Executar grátis
Este validador confere um tabuleiro 9x9 parcialmente preenchido sem tentar solucioná-lo. Ele compara cada célula ocupada com as regras padrão de unicidade de linhas, colunas e blocos 3x3, retornando um resultado claro de legalidade e a localização exata de todo número duplicado. As células vazias são ignoradas, portanto você pode verificar um desafio inicial, uma partida em andamento ou uma grade quase completa.
Informe um tabuleiro parcial em um formato confiável
Digite exatamente nove linhas com nove células em cada uma. Use os algarismos de 1 a 9 nas células preenchidas e um ponto ou zero nos espaços vazios. Linhas compactas como <code>53..7....</code> são práticas para copiar desafios em texto simples; também é possível inserir espaços ou vírgulas entre as células para facilitar a leitura. O validador remove esses separadores antes da contagem, mas não tenta adivinhar o significado de outros símbolos. Esse limite rigoroso é importante porque uma grade malformada é diferente de uma posição ilegal: a primeira não identifica 81 células de modo confiável, enquanto a segunda tem o formato correto, porém viola uma ou mais regras de unicidade. Se houver linhas de mais ou de menos, se uma linha tiver quantidade incorreta de células ou se aparecer um caractere incompatível, a solicitação retorna um erro de entrada. Não se presume que o desafio tenha solução, que as pistas sejam simétricas ou que a quantidade delas seja suficiente. A entrada representa somente o estado atual do tabuleiro.
Entenda os conflitos de linhas, colunas e blocos
A verificação aplica separadamente as três regras locais tradicionais. Um número preenchido não pode aparecer mais de uma vez em cada linha horizontal, coluna vertical ou bloco 3x3. Células vazias ficam fora das comparações. Quando todos os números obedecem às três condições, <code>valid</code> retorna true e a lista de violações fica vazia. Ao encontrar uma repetição, cada violação informa seu tipo, o índice iniciado em um, o valor repetido e todas as células que contêm esse valor na unidade afetada. As coordenadas de linha e coluna também começam em um, de acordo com a maneira habitual de descrever posições de Sudoku. O mesmo par pode gerar mais de um registro: dois números cinco na mesma linha e no mesmo bloco superior esquerdo infringem as duas restrições, então ambos os fatos aparecem. A ordem é sempre estável: primeiro linhas, depois colunas e, por fim, blocos; em cada unidade, os números são listados de 1 a 9. Essa previsibilidade facilita testar, comparar, armazenar e exibir os resultados.
Use a validação no ponto certo do seu fluxo
A validação de legalidade é um diagnóstico específico, não um solucionador nem uma prova de que o desafio foi bem elaborado. Um resultado true significa apenas que os números atualmente inseridos não repetem outro valor preenchido na mesma linha, coluna ou bloco. O tabuleiro ainda pode não ter conclusão possível por causa de uma contradição mais profunda, aceitar várias soluções ou apresentar pistas inadequadas para publicação. Por isso, a ferramenta funciona melhor como uma barreira inicial. Um editor pode chamá-la depois de cada alteração para destacar erros imediatos. Uma rotina de importação pode rejeitar grades danificadas ou digitadas incorretamente antes de enviá-las a um solucionador mais caro. Um aplicativo educacional pode conferir as jogadas do aluno sem revelar a resposta. Como o algoritmo percorre um conjunto fixo de 81 células e não faz chamadas de rede, seu funcionamento é rápido e reproduzível. A versão no navegador atende ao uso interativo, enquanto sistemas automatizados podem enviar o mesmo tabuleiro à API por US$ 0,002 por solicitação. Em ambos os ambientes, diferencie entrada malformada de um tabuleiro bem formado cujo <code>valid</code> seja false.
Casos de uso
Encontrar erros de digitação
Confira uma grade transcrita e encontre pistas repetidas antes de salvá-la ou encaminhá-la a um solucionador.
Orientar o jogador sem entregar a resposta
Mostre linhas, colunas e blocos com conflitos imediatos sem revelar a solução do desafio.
Validar registros importados
Rejeite grades malformadas como erros de entrada e sinalize posições bem formadas, porém ilegais, em uma resposta estruturada e previsível.
Perguntas frequentes
Um resultado válido significa que o Sudoku tem solução?
Não. Ele indica somente que as células preenchidas não violam a unicidade de linhas, colunas ou blocos 3x3. A ferramenta não testa se existe solução nem se ela é única.
Como devo representar as células vazias?
Use um ponto ou o algarismo zero. Os dois são tratados como espaços vazios e ignorados na procura por repetições.
Posso separar as células com espaços ou vírgulas?
Sim. Espaços, vírgulas e barras verticais são aceitos como separadores visuais. Depois que forem removidos, cada linha deverá conter exatamente nove células.
Por que o mesmo par de células pode aparecer em duas violações?
Uma repetição pode quebrar mais de uma regra ao mesmo tempo, como quando está na mesma linha e no mesmo bloco 3x3. Cada unidade afetada é informada separadamente.
Quanto custa uma solicitação de API?
Cada solicitação de API custa US$ 0,002. A versão interativa do navegador é executada localmente sem custo.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/game/sudoku-validate-board \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"board":"53..7....\n6..195...\n.98....6.\n8...6...3\n4..8.3..1\n7...2...6\n.6....28.\n...419..5\n....8..79"}'const res = await fetch("https://api.kit.forhosting.com/game/sudoku-validate-board", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"board": "53..7....\n6..195...\n.98....6.\n8...6...3\n4..8.3..1\n7...2...6\n.6....28.\n...419..5\n....8..79"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/game/sudoku-validate-board",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"board": "53..7....\n6..195...\n.98....6.\n8...6...3\n4..8.3..1\n7...2...6\n.6....28.\n...419..5\n....8..79"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/game/sudoku-validate-board", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"board":"53..7....\\n6..195...\\n.98....6.\\n8...6...3\\n4..8.3..1\\n7...2...6\\n.6....28.\\n...419..5\\n....8..79"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"board":"53..7....\n6..195...\n.98....6.\n8...6...3\n4..8.3..1\n7...2...6\n.6....28.\n...419..5\n....8..79"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/game/sudoku-validate-board", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"board": "53..7....\n6..195...\n.98....6.\n8...6...3\n4..8.3..1\n7...2...6\n.6....28.\n...419..5\n....8..79"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "game.sudoku_validate_board",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |