-
Notifications
You must be signed in to change notification settings - Fork 9
/
Resolvedor.py
133 lines (107 loc) · 4.12 KB
/
Resolvedor.py
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#Resolvedor de SUDOKU 9X9
#Modificado por: Carlos Bustillo
#Bibliografia:https://github.com/jorditorresBCN/Sudoku/blob/master/Sudoku.ipynb
import numpy as np
# Diccionario con los numeros de la grilla
def resolver(grilla):
valores = valoresGrilla(grilla)
return buscar(valores)
# Intercambio de elementos
def intercambiar(A, B):
return [a+b for a in A for b in B]
# Para mostrar la grilla
def mostrar(numeros):
ancho = 1+max(len(numeros[s]) for s in casillas)
line = '+'.join(['-'*(ancho*3)]*3)
for r in filas:
print(''.join(numeros[r+c].center(ancho)+('|' if c in '36' else '')
for c in columnas))
if r in 'CF': print(line)
# Definir valores iniciales
def valoresIniciales(grilla):
return dict(zip(casillas, grilla))
# Definir valores en la grilla
def valoresGrilla(grilla):
numeros = []
for c in grilla:
if c == '.':
numeros.append('123456789')
elif c in '123456789':
numeros.append(c)
return dict(zip(casillas, numeros))
# Elimina los valores que ya estan dentro de la grilla
def eliminar(numeros):
solved_values = [box for box in numeros.keys() if len(numeros[box]) == 1]
for box in solved_values:
digit = numeros[box]
for vecino in vecinos[box]:
numeros[vecino] = numeros[vecino].replace(digit,'')
return numeros
def unica_opcion(numeros):
for unit in unitlist:
for digit in '123456789':
dplaces = [box for box in unit if digit in numeros[box]]
if len(dplaces) == 1:
numeros[dplaces[0]] = digit
return numeros
def reduce_sudoku(numeros):
stalled = False
while not stalled:
# Check how many boxes have a determined value
solved_values_before = len([box for box in numeros.keys() if len(numeros[box]) == 1])
# se the Eliminate Strategy
numeros = eliminar(numeros)
# Use the Only Choice Strategy
numeros = unica_opcion(numeros)
# Check how many boxes have a determined value, to compare
solved_values_after = len([box for box in numeros.keys() if len(numeros[box]) == 1])
# If no new values were added, stop the loop.
stalled = solved_values_before == solved_values_after
# Sanity check, return False if there is a box with zero available values:
if len([box for box in numeros.keys() if len(numeros[box]) == 0]):
return False
return numeros
def buscar(numeros):
numeros = reduce_sudoku(numeros)
if numeros is False:
return False ##Fallo
if all(len(numeros[s]) == 1 for s in casillas):
return numeros ## Listo
# Choose one of the unfilled boxes
unfilled_squares= [(len(numeros[s]), s) for s in casillas if len(numeros[s]) > 1]
n,s = min(unfilled_squares)
# Solve the next boxes
for value in numeros[s]:
nova_sudoku = numeros.copy()
nova_sudoku[s] = value
attempt = buscar(nova_sudoku)
if attempt:
return attempt
filas = 'ABCDEFGHI'
columnas = '123456789'
casillas = intercambiar(filas, columnas)
fila_units = [intercambiar(r, columnas) for r in filas]
columna_units = [intercambiar(filas, c) for c in columnas]
cuadrado_units = [intercambiar(rs, cs) for rs in ('ABC','DEF','GHI') for cs in ('123','456','789')]
unitlist = fila_units + columna_units + cuadrado_units
unidades = dict((s, [u for u in unitlist if s in u]) for s in casillas)
vecinos = dict((s, set(sum(unidades[s],[]))-set([s])) for s in casillas)
###########################################
#### MAIN ####
###########################################
if __name__ == '__main__':
#Con manejador de archivos
archivo = open("vector.txt","r")
lineas = archivo.read()
#lineas = lineas.replace('\r', '').replace('\n', '')
archivo.close()
print ("\nOriginal:")
mostrar(valoresIniciales(lineas))
print (" ")
print ("Solucion:")
mostrar(resolver(lineas))
# Acceder al diccionario
a = resolver(lineas)
b = sorted(a.items())
# Aca trabajamos con manejadores de archivo
np.save('Solucion', b)