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

1"""GeneratorPattern — a fixed given-pattern for puzzle generation. 

2 

3Port of Java's ``GeneratorPattern`` class. Indicates which cells must 

4contain givens when generating new puzzles. 

5 

6Reference: ``generator/GeneratorPattern.java``. 

7""" 

8 

9from __future__ import annotations 

10 

11from dataclasses import dataclass, field 

12 

13from hodoku.core.grid import LENGTH 

14 

15 

16@dataclass 

17class GeneratorPattern: 

18 """A pattern indicating which cells should contain givens. 

19 

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 """ 

29 

30 name: str = "" 

31 pattern: list[bool] = field(default_factory=lambda: [False] * LENGTH) 

32 valid: bool = False 

33 

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 ) 

40 

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) 

45 

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 ) 

53 

54 def __str__(self) -> str: 

55 return f"{self.name}: {self.pattern}"