Coverage for src / hodoku / core / types.py: 100%
133 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
1from enum import Enum
4class DifficultyType(Enum):
5 INCOMPLETE = 0
6 EASY = 1
7 MEDIUM = 2
8 HARD = 3
9 UNFAIR = 4
10 EXTREME = 5
13class SolutionCategory(Enum):
14 SINGLES = "Singles"
15 INTERSECTIONS = "Intersections"
16 SUBSETS = "Subsets"
17 BASIC_FISH = "Basic Fish"
18 FINNED_BASIC_FISH = "(Sashimi) Finned Fish"
19 FRANKEN_FISH = "Franken Fish"
20 FINNED_FRANKEN_FISH = "Finned Franken Fish"
21 MUTANT_FISH = "Mutant Fish"
22 FINNED_MUTANT_FISH = "Finned Mutant Fish"
23 SINGLE_DIGIT_PATTERNS = "Single Digit Patterns"
24 COLORING = "Coloring"
25 UNIQUENESS = "Uniqueness"
26 CHAINS_AND_LOOPS = "Chains and Loops"
27 WINGS = "Wings"
28 ALMOST_LOCKED_SETS = "Almost Locked Sets"
29 ENUMERATIONS = "Enumerations"
30 MISCELLANEOUS = "Miscellaneous"
31 LAST_RESORT = "Last Resort"
34class SolutionType(Enum):
35 # Singles
36 FULL_HOUSE = "Full House"
37 HIDDEN_SINGLE = "Hidden Single"
38 NAKED_SINGLE = "Naked Single"
39 # Intersections
40 LOCKED_CANDIDATES_1 = "Locked Candidates Type 1 (Pointing)"
41 LOCKED_CANDIDATES_2 = "Locked Candidates Type 2 (Claiming)"
42 LOCKED_PAIR = "Locked Pair"
43 LOCKED_TRIPLE = "Locked Triple"
44 # Subsets
45 NAKED_PAIR = "Naked Pair"
46 NAKED_TRIPLE = "Naked Triple"
47 NAKED_QUADRUPLE = "Naked Quadruple"
48 HIDDEN_PAIR = "Hidden Pair"
49 HIDDEN_TRIPLE = "Hidden Triple"
50 HIDDEN_QUADRUPLE = "Hidden Quadruple"
51 # Basic fish
52 X_WING = "X-Wing"
53 SWORDFISH = "Swordfish"
54 JELLYFISH = "Jellyfish"
55 SQUIRMBAG = "Squirmbag"
56 WHALE = "Whale"
57 LEVIATHAN = "Leviathan"
58 # Finned basic fish
59 FINNED_X_WING = "Finned X-Wing"
60 FINNED_SWORDFISH = "Finned Swordfish"
61 FINNED_JELLYFISH = "Finned Jellyfish"
62 FINNED_SQUIRMBAG = "Finned Squirmbag"
63 FINNED_WHALE = "Finned Whale"
64 FINNED_LEVIATHAN = "Finned Leviathan"
65 SASHIMI_X_WING = "Sashimi X-Wing"
66 SASHIMI_SWORDFISH = "Sashimi Swordfish"
67 SASHIMI_JELLYFISH = "Sashimi Jellyfish"
68 SASHIMI_SQUIRMBAG = "Sashimi Squirmbag"
69 SASHIMI_WHALE = "Sashimi Whale"
70 SASHIMI_LEVIATHAN = "Sashimi Leviathan"
71 # Franken fish
72 FRANKEN_X_WING = "Franken X-Wing"
73 FRANKEN_SWORDFISH = "Franken Swordfish"
74 FRANKEN_JELLYFISH = "Franken Jellyfish"
75 FRANKEN_SQUIRMBAG = "Franken Squirmbag"
76 FRANKEN_WHALE = "Franken Whale"
77 FRANKEN_LEVIATHAN = "Franken Leviathan"
78 FINNED_FRANKEN_X_WING = "Finned Franken X-Wing"
79 FINNED_FRANKEN_SWORDFISH = "Finned Franken Swordfish"
80 FINNED_FRANKEN_JELLYFISH = "Finned Franken Jellyfish"
81 FINNED_FRANKEN_SQUIRMBAG = "Finned Franken Squirmbag"
82 FINNED_FRANKEN_WHALE = "Finned Franken Whale"
83 FINNED_FRANKEN_LEVIATHAN = "Finned Franken Leviathan"
84 # Mutant fish
85 MUTANT_X_WING = "Mutant X-Wing"
86 MUTANT_SWORDFISH = "Mutant Swordfish"
87 MUTANT_JELLYFISH = "Mutant Jellyfish"
88 MUTANT_SQUIRMBAG = "Mutant Squirmbag"
89 MUTANT_WHALE = "Mutant Whale"
90 MUTANT_LEVIATHAN = "Mutant Leviathan"
91 FINNED_MUTANT_X_WING = "Finned Mutant X-Wing"
92 FINNED_MUTANT_SWORDFISH = "Finned Mutant Swordfish"
93 FINNED_MUTANT_JELLYFISH = "Finned Mutant Jellyfish"
94 FINNED_MUTANT_SQUIRMBAG = "Finned Mutant Squirmbag"
95 FINNED_MUTANT_WHALE = "Finned Mutant Whale"
96 FINNED_MUTANT_LEVIATHAN = "Finned Mutant Leviathan"
97 # Kraken fish
98 KRAKEN_FISH_TYPE_1 = "Kraken Fish Type 1"
99 KRAKEN_FISH_TYPE_2 = "Kraken Fish Type 2"
100 # Single digit patterns
101 SKYSCRAPER = "Skyscraper"
102 TWO_STRING_KITE = "2-String Kite"
103 TURBOT_FISH = "Turbot Fish"
104 EMPTY_RECTANGLE = "Empty Rectangle"
105 DUAL_TWO_STRING_KITE = "Dual 2-String Kite"
106 DUAL_EMPTY_RECTANGLE = "Dual Empty Rectangle"
107 # Coloring
108 SIMPLE_COLORS_TRAP = "Simple Colors Trap"
109 SIMPLE_COLORS_WRAP = "Simple Colors Wrap"
110 MULTI_COLORS_1 = "Multi-Colors 1"
111 MULTI_COLORS_2 = "Multi-Colors 2"
112 # Uniqueness
113 UNIQUENESS_1 = "Uniqueness Test 1"
114 UNIQUENESS_2 = "Uniqueness Test 2"
115 UNIQUENESS_3 = "Uniqueness Test 3"
116 UNIQUENESS_4 = "Uniqueness Test 4"
117 UNIQUENESS_5 = "Uniqueness Test 5"
118 UNIQUENESS_6 = "Uniqueness Test 6"
119 BUG_PLUS_1 = "Bivalue Universal Grave + 1"
120 HIDDEN_RECTANGLE = "Hidden Rectangle"
121 AVOIDABLE_RECTANGLE_1 = "Avoidable Rectangle Type 1"
122 AVOIDABLE_RECTANGLE_2 = "Avoidable Rectangle Type 2"
123 # Wings
124 XY_WING = "XY-Wing"
125 XYZ_WING = "XYZ-Wing"
126 W_WING = "W-Wing"
127 # Chains and loops
128 X_CHAIN = "X-Chain"
129 XY_CHAIN = "XY-Chain"
130 REMOTE_PAIR = "Remote Pair"
131 CONTINUOUS_NICE_LOOP = "Continuous Nice Loop"
132 DISCONTINUOUS_NICE_LOOP = "Discontinuous Nice Loop"
133 AIC = "AIC"
134 GROUPED_CONTINUOUS_NICE_LOOP = "Grouped Continuous Nice Loop"
135 GROUPED_DISCONTINUOUS_NICE_LOOP = "Grouped Discontinuous Nice Loop"
136 GROUPED_AIC = "Grouped AIC"
137 # Almost locked sets
138 ALS_XZ = "Almost Locked Set XZ-Rule"
139 ALS_XY_WING = "Almost Locked Set XY-Wing"
140 ALS_XY_CHAIN = "Almost Locked Set XY-Chain"
141 DEATH_BLOSSOM = "Death Blossom"
142 SUE_DE_COQ = "Sue de Coq"
143 # Enumerations (forcing chains/nets)
144 FORCING_CHAIN_CONTRADICTION = "Forcing Chain Contradiction"
145 FORCING_CHAIN_VERITY = "Forcing Chain Verity"
146 FORCING_NET_CONTRADICTION = "Forcing Net Contradiction"
147 FORCING_NET_VERITY = "Forcing Net Verity"
148 # Last resort
149 TEMPLATE_SET = "Template Set"
150 TEMPLATE_DEL = "Template Delete"
151 BRUTE_FORCE = "Brute Force"
152 # Sentinels
153 INCOMPLETE = "Incomplete Solution"
154 GIVE_UP = "Give Up"
156 def is_single(self) -> bool:
157 return self in (
158 SolutionType.FULL_HOUSE,
159 SolutionType.HIDDEN_SINGLE,
160 SolutionType.NAKED_SINGLE,
161 )