]> gitweb.pimeys.fr Git - sudoku.git/blob - sudoku_types.py
Fonction de debug pour afficher rapidement tous les linked_fields
[sudoku.git] / sudoku_types.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 """Définition des linked_fields de différents types de sudoku"""
5
6 rouge = "\e[0;31m"
7 rien = "\e[0m"
8
9 class SudokuType(object):
10 def render(self, values, adaptsize=True):
11 """Affiche le sudoku avec un contenu."""
12 if adaptsize:
13 maxsize = max([len(i) for i in values])
14 valuetemplate = "%%%ss" % maxsize
15 else:
16 valuetemplate = "%s"
17 map = {str(i) : valuetemplate % values[i] for i in range(self.size)}
18 map["empty"] = valuetemplate % " "
19 return self.template % map
20
21 def render_field(self, field):
22 """Met en évidence un linked_field en l'affichant en rouge"""
23 if type(field) == int:
24 field = self.linked_fields[field]
25 values = [rouge + "X" + rien if i in field else "_" for i in range(self.size)]
26 return self.render(values, False)
27
28 def debug(self, pause=False):
29 """Affiche successivement tous les linked_fields"""
30 for f in self.linked_fields:
31 print self.render_field(f)
32 if pause:
33 raw_input(u"…".encode("utf-8"))
34
35 class BasicSudoku(SudokuType):
36 size = 81
37 chars = [str(i) for i in range(1, 10)]
38
39 linked_fields = ( [[9*ligne + col for col in range(9)] for ligne in range(9)] # lignes
40 + [[9*ligne + col for ligne in range(9)] for col in range(9)] # colonnes
41 + [[27*bl + 3*bc + 9*l + c for l in range(3) for c in range(3)] for bl in range(3) for bc in range(3)] # blocs
42 )
43
44 template = "\n".join(["".join(["%%(%s)s" % (9*i + j) for j in range(9)]) for i in range(9)])
45
46 # random local garbage
47 del i, j, l, c, bl, bc, col, ligne
48
49 class Samurai(SudokuType):
50 size = (4*9 + 5)*9
51 chars = [str(i) for i in range(1, 10)]
52
53 linked_fields = ( [[start + offset for offset in range(9)] for start in [0, 18, 36, 54, 72, 90, 108, 129, 150] + [9, 27, 45, 63, 81, 99, 120, 141, 162] + [114, 135, 156, 171, 180, 189, 204, 225, 246] + [198, 219, 240, 261, 279, 297, 315, 333, 351] + [210, 231, 252, 270, 288, 306, 324, 342, 360]]
54 # Après, j'ai eu la flemme de faire en finesse, j'ai bourriné et j'hardcode
55 # Les colonnes
56 +[[0, 18, 36, 54, 72, 90, 108, 129, 150],
57 [1, 19, 37, 55, 73, 91, 109, 130, 151],
58 [2, 20, 38, 56, 74, 92, 110, 131, 152],
59 [3, 21, 39, 57, 75, 93, 111, 132, 153],
60 [4, 22, 40, 58, 76, 94, 112, 133, 154],
61 [5, 23, 41, 59, 77, 95, 113, 134, 155],
62 [6, 24, 42, 60, 78, 96, 114, 135, 156],
63 [7, 25, 43, 61, 79, 97, 115, 136, 157],
64 [8, 26, 44, 62, 80, 98, 116, 137, 158],
65 [9, 27, 45, 63, 81, 99, 120, 141, 162],
66 [10, 28, 46, 64, 82, 100, 121, 142, 163],
67 [11, 29, 47, 65, 83, 101, 122, 143, 164],
68 [12, 30, 48, 66, 84, 102, 123, 144, 165],
69 [13, 31, 49, 67, 85, 103, 124, 145, 166],
70 [14, 32, 50, 68, 86, 104, 125, 146, 167],
71 [15, 33, 51, 69, 87, 105, 126, 147, 168],
72 [16, 34, 52, 70, 88, 106, 127, 148, 169],
73 [17, 35, 53, 71, 89, 107, 128, 149, 170],
74 [114, 135, 156, 171, 180, 189, 204, 225, 246],
75 [115, 136, 157, 172, 181, 190, 205, 226, 247],
76 [116, 137, 158, 173, 182, 191, 206, 227, 248],
77 [117, 138, 159, 174, 183, 192, 207, 228, 249],
78 [118, 139, 160, 175, 184, 193, 208, 229, 250],
79 [119, 140, 161, 176, 185, 194, 209, 230, 251],
80 [120, 141, 162, 177, 186, 195, 210, 231, 252],
81 [121, 142, 163, 178, 187, 196, 211, 232, 253],
82 [122, 143, 164, 179, 188, 197, 212, 233, 254],
83 [198, 219, 240, 261, 279, 297, 315, 333, 351],
84 [199, 220, 241, 262, 280, 298, 316, 334, 352],
85 [200, 221, 242, 263, 281, 299, 317, 335, 353],
86 [201, 222, 243, 264, 282, 300, 318, 336, 354],
87 [202, 223, 244, 265, 283, 301, 319, 337, 355],
88 [203, 224, 245, 266, 284, 302, 320, 338, 356],
89 [204, 225, 246, 267, 285, 303, 321, 339, 357],
90 [205, 226, 247, 268, 286, 304, 322, 340, 358],
91 [206, 227, 248, 269, 287, 305, 323, 341, 359],
92 [210, 231, 252, 270, 288, 306, 324, 342, 360],
93 [211, 232, 253, 271, 289, 307, 325, 343, 361],
94 [212, 233, 254, 272, 290, 308, 326, 344, 362],
95 [213, 234, 255, 273, 291, 309, 327, 345, 363],
96 [214, 235, 256, 274, 292, 310, 328, 346, 364],
97 [215, 236, 257, 275, 293, 311, 329, 347, 365],
98 [216, 237, 258, 276, 294, 312, 330, 348, 366],
99 [217, 238, 259, 277, 295, 313, 331, 349, 367],
100 [218, 239, 260, 278, 296, 314, 332, 350, 368]]
101 # Les blocs
102 +[[0, 1, 2, 18, 19, 20, 36, 37, 38],
103 [3, 4, 5, 21, 22, 23, 39, 40, 41],
104 [6, 7, 8, 24, 25, 26, 42, 43, 44],
105 [9, 10, 11, 27, 28, 29, 45, 46, 47],
106 [12, 13, 14, 30, 31, 32, 48, 49, 50],
107 [15, 16, 17, 33, 34, 35, 51, 52, 53],
108 [54, 55, 56, 72, 73, 74, 90, 91, 92],
109 [57, 58, 59, 75, 76, 77, 93, 94, 95],
110 [60, 61, 62, 78, 79, 80, 96, 97, 98],
111 [63, 64, 65, 81, 82, 83, 99, 100, 101],
112 [66, 67, 68, 84, 85, 86, 102, 103, 104],
113 [69, 70, 71, 87, 88, 89, 105, 106, 107],
114 [108, 109, 110, 129, 130, 131, 150, 151, 152],
115 [111, 112, 113, 132, 133, 134, 153, 154, 155],
116 [114, 115, 116, 135, 136, 137, 156, 157, 158],
117 [117, 118, 119, 138, 139, 140, 159, 160, 161],
118 [120, 121, 122, 141, 142, 143, 162, 163, 164],
119 [123, 124, 125, 144, 145, 146, 165, 166, 167],
120 [126, 127, 128, 147, 148, 149, 168, 169, 170],
121 [171, 172, 173, 180, 181, 182, 189, 190, 191],
122 [174, 175, 176, 183, 184, 185, 192, 193, 194],
123 [177, 178, 179, 186, 187, 188, 195, 196, 197],
124 [198, 199, 200, 219, 220, 221, 240, 241, 242],
125 [201, 202, 203, 222, 223, 224, 243, 244, 245],
126 [204, 205, 206, 225, 226, 227, 246, 247, 248],
127 [207, 208, 209, 228, 229, 230, 249, 250, 251],
128 [210, 211, 212, 231, 232, 233, 252, 253, 254],
129 [213, 214, 215, 234, 235, 236, 255, 256, 257],
130 [216, 217, 218, 237, 238, 239, 258, 259, 260],
131 [261, 262, 263, 279, 280, 281, 297, 298, 299],
132 [264, 265, 266, 282, 283, 284, 300, 301, 302],
133 [267, 268, 269, 285, 286, 287, 303, 304, 305],
134 [270, 271, 272, 288, 289, 290, 306, 307, 308],
135 [273, 274, 275, 291, 292, 293, 309, 310, 311],
136 [276, 277, 278, 294, 295, 296, 312, 313, 314],
137 [315, 316, 317, 333, 334, 335, 351, 352, 353],
138 [318, 319, 320, 336, 337, 338, 354, 355, 356],
139 [321, 322, 323, 339, 340, 341, 357, 358, 359],
140 [324, 325, 326, 342, 343, 344, 360, 361, 362],
141 [327, 328, 329, 345, 346, 347, 363, 364, 365],
142 [330, 331, 332, 348, 349, 350, 366, 367, 368]])
143
144 template = "%(0)s%(1)s%(2)s%(3)s%(4)s%(5)s%(6)s%(7)s%(8)s%(empty)s%(empty)s%(empty)s%(9)s%(10)s%(11)s%(12)s%(13)s%(14)s%(15)s%(16)s%(17)s\n%(18)s%(19)s%(20)s%(21)s%(22)s%(23)s%(24)s%(25)s%(26)s%(empty)s%(empty)s%(empty)s%(27)s%(28)s%(29)s%(30)s%(31)s%(32)s%(33)s%(34)s%(35)s\n%(36)s%(37)s%(38)s%(39)s%(40)s%(41)s%(42)s%(43)s%(44)s%(empty)s%(empty)s%(empty)s%(45)s%(46)s%(47)s%(48)s%(49)s%(50)s%(51)s%(52)s%(53)s\n%(54)s%(55)s%(56)s%(57)s%(58)s%(59)s%(60)s%(61)s%(62)s%(empty)s%(empty)s%(empty)s%(63)s%(64)s%(65)s%(66)s%(67)s%(68)s%(69)s%(70)s%(71)s\n%(72)s%(73)s%(74)s%(75)s%(76)s%(77)s%(78)s%(79)s%(80)s%(empty)s%(empty)s%(empty)s%(81)s%(82)s%(83)s%(84)s%(85)s%(86)s%(87)s%(88)s%(89)s\n%(90)s%(91)s%(92)s%(93)s%(94)s%(95)s%(96)s%(97)s%(98)s%(empty)s%(empty)s%(empty)s%(99)s%(100)s%(101)s%(102)s%(103)s%(104)s%(105)s%(106)s%(107)s\n%(108)s%(109)s%(110)s%(111)s%(112)s%(113)s%(114)s%(115)s%(116)s%(117)s%(118)s%(119)s%(120)s%(121)s%(122)s%(123)s%(124)s%(125)s%(126)s%(127)s%(128)s\n%(129)s%(130)s%(131)s%(132)s%(133)s%(134)s%(135)s%(136)s%(137)s%(138)s%(139)s%(140)s%(141)s%(142)s%(143)s%(144)s%(145)s%(146)s%(147)s%(148)s%(149)s\n%(150)s%(151)s%(152)s%(153)s%(154)s%(155)s%(156)s%(157)s%(158)s%(159)s%(160)s%(161)s%(162)s%(163)s%(164)s%(165)s%(166)s%(167)s%(168)s%(169)s%(170)s\n%(empty)s%(empty)s%(empty)s%(empty)s%(empty)s%(empty)s%(171)s%(172)s%(173)s%(174)s%(175)s%(176)s%(177)s%(178)s%(179)s%(empty)s%(empty)s%(empty)s%(empty)s%(empty)s%(empty)s\n%(empty)s%(empty)s%(empty)s%(empty)s%(empty)s%(empty)s%(180)s%(181)s%(182)s%(183)s%(184)s%(185)s%(186)s%(187)s%(188)s%(empty)s%(empty)s%(empty)s%(empty)s%(empty)s%(empty)s\n%(empty)s%(empty)s%(empty)s%(empty)s%(empty)s%(empty)s%(189)s%(190)s%(191)s%(192)s%(193)s%(194)s%(195)s%(196)s%(197)s%(empty)s%(empty)s%(empty)s%(empty)s%(empty)s%(empty)s\n%(198)s%(199)s%(200)s%(201)s%(202)s%(203)s%(204)s%(205)s%(206)s%(207)s%(208)s%(209)s%(210)s%(211)s%(212)s%(213)s%(214)s%(215)s%(216)s%(217)s%(218)s\n%(219)s%(220)s%(221)s%(222)s%(223)s%(224)s%(225)s%(226)s%(227)s%(228)s%(229)s%(230)s%(231)s%(232)s%(233)s%(234)s%(235)s%(236)s%(237)s%(238)s%(239)s\n%(240)s%(241)s%(242)s%(243)s%(244)s%(245)s%(246)s%(247)s%(248)s%(249)s%(250)s%(251)s%(252)s%(253)s%(254)s%(255)s%(256)s%(257)s%(258)s%(259)s%(260)s\n%(261)s%(262)s%(263)s%(264)s%(265)s%(266)s%(267)s%(268)s%(269)s%(empty)s%(empty)s%(empty)s%(270)s%(271)s%(272)s%(273)s%(274)s%(275)s%(276)s%(277)s%(278)s\n%(279)s%(280)s%(281)s%(282)s%(283)s%(284)s%(285)s%(286)s%(287)s%(empty)s%(empty)s%(empty)s%(288)s%(289)s%(290)s%(291)s%(292)s%(293)s%(294)s%(295)s%(296)s\n%(297)s%(298)s%(299)s%(300)s%(301)s%(302)s%(303)s%(304)s%(305)s%(empty)s%(empty)s%(empty)s%(306)s%(307)s%(308)s%(309)s%(310)s%(311)s%(312)s%(313)s%(314)s\n%(315)s%(316)s%(317)s%(318)s%(319)s%(320)s%(321)s%(322)s%(323)s%(empty)s%(empty)s%(empty)s%(324)s%(325)s%(326)s%(327)s%(328)s%(329)s%(330)s%(331)s%(332)s\n%(333)s%(334)s%(335)s%(336)s%(337)s%(338)s%(339)s%(340)s%(341)s%(empty)s%(empty)s%(empty)s%(342)s%(343)s%(344)s%(345)s%(346)s%(347)s%(348)s%(349)s%(350)s\n%(351)s%(352)s%(353)s%(354)s%(355)s%(356)s%(357)s%(358)s%(359)s%(empty)s%(empty)s%(empty)s%(360)s%(361)s%(362)s%(363)s%(364)s%(365)s%(366)s%(367)s%(368)s"
145
146 class examples:
147 fail = "011111111000000000000000000000000000000000000000000000000000000000000000000000000"
148 hard = "200000060000075030048090100000300000300010009000008000001020570080730000090000004"
149 easy = "487000503056000000031500090000840051070605030310072000060009310000000970703000825"
150 samurai = "000385000000000100039000800960000040400000020003000060000000006000400005000076900000080004000100074290030007004000300010005020080080009000008000700900060007000004000306000064000000200040006000000170000609000900000400070007002000200000200090090030500060003000100500090042610009000900080000002530000300001000500000000040000800090000002010000095005000640002000000000685000"