Coverage for src / hodoku / generator / pattern.py: 100%
18 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-21 08:35 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-21 08:35 +0000
1"""GeneratorPattern — a fixed given-pattern for puzzle generation.
3Port of Java's ``GeneratorPattern`` class. Indicates which cells must
4contain givens when generating new puzzles.
6Reference: ``generator/GeneratorPattern.java``.
7"""
9from __future__ import annotations
11from dataclasses import dataclass, field
13from hodoku.core.grid import LENGTH
16@dataclass
17class GeneratorPattern:
18 """A pattern indicating which cells should contain givens.
20 Parameters
21 ----------
22 name : str
23 Human-readable name for the pattern.
24 pattern : list[bool]
25 81-element list; ``True`` means the cell must be a given.
26 valid : bool
27 Whether the pattern has been validated (can produce a unique puzzle).
28 """
30 name: str = ""
31 pattern: list[bool] = field(default_factory=lambda: [False] * LENGTH)
32 valid: bool = False
34 def __post_init__(self) -> None:
35 if len(self.pattern) != LENGTH:
36 raise ValueError(
37 f"pattern must have exactly {LENGTH} elements, "
38 f"got {len(self.pattern)}"
39 )
41 @property
42 def num_givens(self) -> int:
43 """Return the number of cells marked as givens in the pattern."""
44 return sum(self.pattern)
46 def clone(self) -> GeneratorPattern:
47 """Return a deep copy of this pattern."""
48 return GeneratorPattern(
49 name=self.name,
50 pattern=list(self.pattern),
51 valid=self.valid,
52 )
54 def __str__(self) -> str:
55 return f"{self.name}: {self.pattern}"