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

1from enum import Enum 

2 

3 

4class DifficultyType(Enum): 

5 INCOMPLETE = 0 

6 EASY = 1 

7 MEDIUM = 2 

8 HARD = 3 

9 UNFAIR = 4 

10 EXTREME = 5 

11 

12 

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" 

32 

33 

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" 

155 

156 def is_single(self) -> bool: 

157 return self in ( 

158 SolutionType.FULL_HOUSE, 

159 SolutionType.HIDDEN_SINGLE, 

160 SolutionType.NAKED_SINGLE, 

161 )