Files
ordinaceprojekt/SběrDatRůzné/SudokuKiller/preskumaj_killer_data5.py
T
Vladimir Buzalka c4c0d1d435 notebookvb
2026-05-08 22:06:57 +02:00

114 lines
4.4 KiB
Python

"""
Průzkumný skript v5: najde správné property names pro cell row/col.
"""
import asyncio
import json
import sys
sys.stdout.reconfigure(encoding="utf-8")
from playwright.async_api import async_playwright
URL = "https://www.dailykillersudoku.com/puzzle/376"
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
context = await browser.new_context(viewport={"width": 1280, "height": 900})
page = await context.new_page()
print(f"Načítám {URL} ...")
await page.goto(URL, wait_until="networkidle", timeout=60_000)
# Zjisti property names buněk v klecích
print("\n=== Cell properties ===")
cell_props = await page.evaluate("""() => {
const cage = DKS.puzzle.board._cages[0];
const cell = cage.cells[0];
return Object.keys(cell);
}""")
print(json.dumps(cell_props, indent=2))
# Zkus všechny varianty row/col
print("\n=== Cell row/col lookup ===")
cell_data = await page.evaluate("""() => {
const cage = DKS.puzzle.board._cages[0];
const cell = cage.cells[0];
const result = {};
for (const key of Object.keys(cell)) {
const val = cell[key];
if (typeof val !== 'function' && typeof val !== 'object') {
result[key] = val;
}
}
return result;
}""")
print(json.dumps(cell_data, indent=2))
# Klece s buňkami — správné property
print("\n=== Cages s buňkami ===")
cages = await page.evaluate("""() => {
const board = DKS.puzzle.board;
return board._cages.map((cage, i) => {
const cells = cage.cells.map(c => {
// Najdi row/col property
const keys = Object.keys(c);
const rowKey = keys.find(k => k.toLowerCase().includes('row') && typeof c[k] === 'number');
const colKey = keys.find(k => (k.toLowerCase().includes('col') || k.toLowerCase().includes('column')) && typeof c[k] === 'number');
return {
row: rowKey ? c[rowKey] : null,
col: colKey ? c[colKey] : null,
rowKey: rowKey,
colKey: colKey
};
});
return {id: i, sum: cage.sum, cells: cells};
});
}""")
for cage in cages[:5]:
cells_str = ", ".join(f"({c['row']},{c['col']})" for c in cage['cells'])
print(f" Klec {cage['id']:2d}: sum={cage['sum']:2d}, buňky=[{cells_str}]")
if cage['id'] == 0:
print(f" rowKey={cage['cells'][0]['rowKey']}, colKey={cage['cells'][0]['colKey']}")
# Pokud row/col stále None, zkus index-based approach
print("\n=== Fallback: cage map z _cells ===")
cage_map = await page.evaluate("""() => {
const board = DKS.puzzle.board;
const result = [];
for (const cage of board._cages) {
const cellPositions = [];
for (const cageCell of cage.cells) {
// Najdi pozici buňky v _cells mřížce
for (let r = 0; r < board.size; r++) {
for (let c = 0; c < board.size; c++) {
if (board._cells[r][c] === cageCell) {
cellPositions.push({row: r, col: c});
}
}
}
}
result.push({sum: cage.sum, cells: cellPositions});
}
return result;
}""")
for i, cage in enumerate(cage_map):
cells_str = ", ".join(f"({c['row']},{c['col']})" for c in cage['cells'])
print(f" Klec {i:2d}: sum={cage['sum']:2d}, buňky=[{cells_str}]")
# Ověření součtů
print("\n=== Ověření součtů ===")
solution = await page.evaluate("() => DKS.puzzle.solution._values")
for i, cage in enumerate(cage_map):
total = sum(solution[c['row']][c['col']] for c in cage['cells'])
ok = "" if total == cage['sum'] else ""
print(f" Klec {i:2d}: sum={cage['sum']:2d}, actual={total:2d} {ok}")
await browser.close()
if __name__ == "__main__":
asyncio.run(main())