数独の盤面チェック|行・列・ブロックの重複を検出
数独では、たった1つの数字の重複でも、見つけにくい段階から盤面が無効になることがあります。このチェッカーは、完成済みまたは途中の標準盤面を調べ、規則違反に関係する入力済みのマスをすべて特定します。行・列・3x3ブロックを個別に確認し、空欄は無視して、各マスの座標と問題の理由を安定した形式で返します。問題を解いたり未入力の数字を明かしたりしないため、練習、問題作成、学習支援、自動検証に安心してお使いいただけます。
無料で実行
確認前に盤面の形式を整えてください
標準的な数独盤面を、各行9マスの全9行で入力してください。入力済みのマスには1から9までの数字を使用します。空欄はピリオドまたは0で表してください。どちらも同じ意味で、重複確認の対象にはなりません。読みやすくするため、マスの間に空白、カンマ、縦線を入れることもできます。そのため、詰めて書く形式と区切って書く形式の両方に対応しています。チェッカーはこれらの区切り文字を取り除きますが、その他の文字を推測したり修正したりはしません。この厳密な扱いにより、形式が誤った入力と、形は正しいものの数独の規則に違反する盤面とを区別できます。9行ちょうどでない場合、区切り文字を除いた各行が9マスでない場合、または未対応の文字が含まれる場合は入力エラーになります。初期配置だけの問題、途中の対局、ほぼ完成した盤面など、部分的な入力も確認できます。すべて空欄の盤面は、衝突する入力済みマスがないため構造上は有効です。送信された配置だけを評価し、空欄を埋めたり値を変更したりすることはありません。
マスごとの重複レポートをご確認ください
結果の先頭には真偽値の<code>valid</code>があります。入力済みのどのマスも、同じ行・列・3x3ブロック内の別のマスと数字が重ならない場合は真になります。<code>filled_cells</code>は、確認した空欄以外のマス数です。盤面が無効な場合、<code>conflict_cells</code>に関係する全マスが並びます。各項目には1から始まる行と列の座標、入力された数字、1つ以上の理由が含まれます。理由には規則の種類、1から始まる単位番号、重複した値が示されます。1つのマスに複数の理由が付く場合もあります。たとえば同じ5が行と左上ブロックの両方に重複していれば、どちらの情報も保持されます。全対象マスを示すため、画面側ではグループを再構成せず、問題箇所を直接強調できます。出力順は常に一定で、マスは読み順、理由は行・列・ブロックの順です。空欄はレポートに含まれません。同じ単位に同一数字が3つある場合も、任意の2つだけではなく3つすべてを表示します。
有効という結果が示す範囲をご理解ください
この確認が答えるのは、現在の配置が行・列・ブロックの一意性規則に直ちに違反しているか、という限定された問いです。有効という結果だけでは、問題を解けること、解が1つだけであること、ヒント配置が良質であることは証明できません。直接の重複がなくても、以前の選択によって別のマスの候補がすべて失われ、完成できない配置があります。その判定にはソルバーや、より深い実行可能性分析が必要であり、この機能では意図的に行いません。この限定性は、答えを明かさずに誤りだけを伝えたい場面で役立ちます。学習ツールは重複マスを強調でき、問題エディターは変更のたびにヒントを確認でき、インポート処理は高コストな工程の前に破損データを除外できます。処理対象は最大81マスで、ネットワーク、乱数、時刻、外部状態を使いません。同じ入力からは必ず同じ構造の出力が得られます。ブラウザーでは同じ純粋なロジックをローカル実行でき、自動処理では1項目あたり$0.002でAPIを利用して、後日の確認用に重複座標を保存できます。
活用例
途中の対局をご確認ください
ソルバーに未入力の数字を明かさせることなく、部分盤面の重複入力を見つけられます。
数独のヒントを点検してください
新しく入力した盤面を検証し、直ちに規則へ違反するすべてのマスを強調できます。
インポート処理を保護してください
後続処理の前に、形式不正のテキストと、形式は正しいものの矛盾する数独データを分けられます。
よくある質問
未完成の数独も確認できますか?
はい。空欄ごとにピリオドまたは0をご使用ください。空欄は重複確認では無視されます。
有効なら必ず解けますか?
いいえ。現在の入力に行・列・ブロックの重複がないという意味だけです。解けることや解が1つであることは証明しません。
1つのマスに複数の理由が付くのはなぜですか?
同じ入力が、行・列・ブロックで同時に数字を重複させる場合があるためです。違反した規則を個別に報告します。
座標は0から始まりますか?
いいえ。人が通常数独を説明する方法に合わせ、行・列・単位番号は1から始まります。
APIでの確認料金はいくらですか?
APIで処理する1項目の料金は$0.002です。ブラウザーの対話型チェッカーはローカルで無料実行できます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/hobby/game-sudoku-validity \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"grid":"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/hobby/game-sudoku-validity", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"grid": "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/hobby/game-sudoku-validity",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"grid": "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/hobby/game-sudoku-validity", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"grid":"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(`{"grid":"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/hobby/game-sudoku-validity", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"grid": "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": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "hobby.game_sudoku_validity",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |