89 lines
2.8 KiB
Markdown
89 lines
2.8 KiB
Markdown
# 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
|