# SudokuKiller — technické poznámky ## Přehled skriptů ### Stahování PDF (původní pipeline) | Skript | Popis | |--------|-------| | `stahni_killer_sudoku.py` | Stáhne puzzle + solution PDF z dailykillersudoku.com | | `stahni_greater_than.py` | Stáhne Greater-Than variantu, přejmenuje existující | | `import_do_mysql.py` | Importuje PDF soubory do MySQL tabulky `sudoku_killer` (binární bloby) | | `30_BatchCrop.py` | Ořeže PDF (odstraní hlavičky/patičky), uloží zpět do DB | ### Strukturovaná data (nový pipeline) | Skript | Popis | |--------|-------| | `stahni_killer_structured.py` | Stáhne strukturovaná data (cage definice + řešení) z webu do sdílené tabulky `puzzles` | | `preskumaj_killer_data*.py` | Průzkumné skripty pro reverzní inženýrství datového formátu | ## Zdroj dat Web: https://www.dailykillersudoku.com/ Každý puzzle má stránku `/puzzle/{N}` s inline JSON daty v HTML: ```javascript DKS.puzzle = new DKS.Puzzle({ "id": 376, "date": "2009-05-04", "difficulty": 4, "board_base64": "AZoACQAE...", "solution_base64": "AJoICQIG...", "puzzle_type": 1 }) ``` ## Dekódování base64 ### board_base64 - 2 bajty header (puzzle_type, flags) - 81 × 2 bajty = 162 bajtů — cage ID pro každou buňku (uint16 big-endian) - N bajtů — součet pro každou klec (1 bajt = max 255) ### solution_base64 - 2 bajty header - 81 bajtů — čísla řešení (řádek po řádku) ## Typy puzzle | puzzle_type | game_type v DB | Popis | |-------------|----------------|-------| | 1 | `killer_sudoku` | Killer Sudoku — klece se součty | | 2 | `killer_sudoku_gt` | Greater-Than Killer Sudoku — klece + nerovnosti | ## Obtížnost Škála 1–10 (z webu), uložena v `difficulty`. ## MySQL — původní tabulka `sudoku_killer` Obsahuje binární PDF v `file_puzzle` / `file_solution` / `file_puzzle_cropped`. - 19 106 KillerSudoku (puzzle 1–31414, 2009–2026) - 11 405 GreaterThan (puzzle 1730–31416, 2010–2026) ## MySQL — sdílená tabulka `puzzles` Strukturovaná data (cage definice + řešení): - `game_type` = `'killer_sudoku'` / `'killer_sudoku_gt'` - `difficulty` = `'1'` až `'10'` - `puzzle` = klece ve formátu `sum,r0c1r0c2|sum,r3c4r3c5|...` - `solution` = flat string 81 číslic - `extra` = `{"grid_size": 9, "puzzle_number": 376, "original_difficulty": 4}` - `source` = `'dailykillersudoku.com'` ## Layout a tisk V podadresáři `Testy/` jsou experimentální skripty pro: - Ořezávání PDF (ray-cast detekce mřížky) - Škálování a umístění 2 puzzle na A4 - Layout konfigurace (`layouts.json`) ## Závislosti - `requests`, `beautifulsoup4` — HTTP + HTML parsing - `fitz` (PyMuPDF) — PDF manipulace, ray-cast cropping - `pypdf` — PDF čtení/zápis - `playwright` — průzkumné skripty (není potřeba pro produkční stahování) - `tqdm` — progress bar