-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsudoku_org
92 lines (86 loc) · 3.46 KB
/
sudoku_org
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
from bool import *
from sat_solver import *
#Prevajanje problemov iz razumljivih na grde
def makeLatinSquare(n):
formule = []
for i in range(n):
for j in range(n):
formule.append(Or([Var(str(i)+str(j)+"_"+str(k+1)) for k in range(n)]))
for i in range(n):
for j in range(n):
for k in range(n):
for l in range(k+1,n):
formule.append(Not(And(
[Var(str(i)+str(j)+"_"+str(k+1)),
Var(str(i)+str(j)+"_"+str(l+1))])))
for row in range(n):
for e1 in range(n):
for e2 in range(e1+1,n):
for c in range(1,n+1):
formule.append(Not(And([Var(str(row)+str(e1)+"_"+str(c)),Var(str(row)+str(e2)+"_"+str(c))])))
for column in range(n):
for e1 in range(n):
for e2 in range(e1+1,n):
for c in range(1,n+1):
formule.append(Not(And([Var(str(e1)+str(column)+"_"+str(c)),Var(str(e2)+str(column)+"_"+str(c))])))
return And(formule)
def visualiseSquare(square,size):
truths = [k for (k,v) in square.items() if v]
positions = {}
for s in truths:
positions[(s[0],s[1])] = s[3]
for i in range(size):
s = ""
for j in range(size):
s+= positions[(str(i),str(j))]+" "
print s
print
def makeSudoku(template):
formule = []
#Vsi pogoji za izpoljena polja
for (i,row) in enumerate(template):
for (j,value) in enumerate(row):
if value != 0:
name = str(i)+str(j)+str(value)
formule.append(Var(name))
#Pogoji da so vsa polja izpoljnena
for i in range(9):
for j in range(9):
formule.append(Or([Var(str(i)+str(j)+str(k+1)) for k in range(9)]))
#Na vsakem polju je samo ena vrednost
for i in range(9):
for j in range(9):
for k in range(9):
for l in range(k+1,9):
formule.append(Not(And(
[Var(str(i)+str(j)+str(k+1)),
Var(str(i)+str(j)+str(l+1))])))
#Pogoji da so vse vrstice razlicne
for row in range(9):
for e1 in range(9):
for e2 in range(e1+1,9):
for c in range(1,10):
formule.append(Not(And([Var(str(row)+str(e1)+str(c)),Var(str(row)+str(e2)+str(c))])))
#Pogoji da so stolpci razlicni
for column in range(9):
for e1 in range(9):
for e2 in range(e1+1,9):
for c in range(1,10):
formule.append(Not(And([Var(str(e1)+str(column)+str(c)),Var(str(e2)+str(column)+str(c))])))
#Pogoji da so kvadrati razlicni
for i in range(3):
for j in range(3):
for e1 in range(i*3,(i+1)*3):
for e2 in range(j*3,(j+1)*3):
for e3 in range (e1+1,(i+1)*3):
for e4 in range(e2+1,(j+1)*3):
for c in range(1,10):
formule.append(Not(And([Var(str(e1)+str(e2)+str(c)),Var(str(e3)+str(e4)+str(c))])))
#Pogoji da ima vsak samo stevilko
for i in range(9):
for j in range(9):
for c1 in range(1,10):
for c2 in range(c1+1,10):
formule.append(Not(And([Var(str(i)+str(j)+str(c1)),Var(str(i)+str(j)+str(c2))])))
return And(formule)
#..................................................................................................