Commit f0c35693 authored by Antoine Roux's avatar Antoine Roux
Browse files

created the tempGrid, now need to implement its use

parent 514ec52c
...@@ -6,18 +6,26 @@ import copy ...@@ -6,18 +6,26 @@ import copy
## REMARQUES ## REMARQUES
#les indices x et y sont parfois inversés à cause de la convention mathématique (y puis x) #les indices x et y sont parfois inversés à cause de la convention mathématique (y puis x)
#pour enlever les 0 au debut et fin : np.trim_zeros
# il faut encore changer dans 2outOf3 : enlever les possibilités pour les voisins
# il faut changer xIndex et yIndex en hIndex et vIndex
class Grid (object) : class Grid (object) :
def __init__ (self, grid) : def __init__ (self, grid) :
""" tempGrid corresponds to the grid where the little numbers are written
Because of python, the third dimension is of length 9 all the time
"""
self.grid = grid self.grid = grid
someGrid = np.zeros((9,9,9))
for k in range (9) :
for i in range (9) :
someGrid[k,i,0] = grid[k,i]
self.tempGrid = someGrid
#self.tempGrid = grid[:,:,np.newaxis] #to make it a 3D array and not 2D
#def getBlock (self, myIndex) :
#index1 = 0 + 3 * (myIndex // 3)
#index2 = 3 + 3 * (myIndex // 3)
#index3 = 0 + 3 * (myIndex % 3)
#index4 = 3 + 3 * (myIndex % 3)
#return Block(self.grid[index1:index2, index3:index4], myIndex)
def __str__ (self) : def __str__ (self) :
string = "" string = ""
string += " -----------------------" + "\n" string += " -----------------------" + "\n"
...@@ -33,6 +41,26 @@ class Grid (object) : ...@@ -33,6 +41,26 @@ class Grid (object) :
string += " -----------------------" + "\n" string += " -----------------------" + "\n"
return string return string
def verify(self) :
""" verifies that finished grid is correct
by checking that all sums of blocks, lines and columns equal 45
returns : True if grid is correct, False otherwise
"""
for k in range (9) :
currentColumn = myGrid.getColumn(k)
if (np.sum(currentColumn.column) != 45) :
return False
currentLine = myGrid.getLine(k)
if (np.sum(currentLine.line) != 45) :
return False
for k in range (3) :
for i in range (3) :
currentBlock = myGrid.getBlock(k,i)
if (np.sum(currentBlock.block) != 45) :
return False
return True
def getBlock (self, xIndex, yIndex) : def getBlock (self, xIndex, yIndex) :
index1 = 3 * yIndex index1 = 3 * yIndex
index2 = 3 + 3 * yIndex index2 = 3 + 3 * yIndex
...@@ -49,6 +77,9 @@ class Grid (object) : ...@@ -49,6 +77,9 @@ class Grid (object) :
def getTile (self, xIndex, yIndex) : def getTile (self, xIndex, yIndex) :
return Tile(self.grid[xIndex, yIndex], xIndex, yIndex) return Tile(self.grid[xIndex, yIndex], xIndex, yIndex)
def getTempTile (self, xIndex, yIndex) :
return Tile(self.tempGrid[xIndex, yIndex], xIndex, yIndex)
def searchForTwoOutOfThree (self) : def searchForTwoOutOfThree (self) :
""" """
searches for lines/columns of blocks in which we know 2 identical numbers searches for lines/columns of blocks in which we know 2 identical numbers
...@@ -99,12 +130,15 @@ class Grid (object) : ...@@ -99,12 +130,15 @@ class Grid (object) :
if (np.count_nonzero(tilesStudied) == 2) : if (np.count_nonzero(tilesStudied) == 2) :
indicesNotZero = np.array(np.nonzero(tilesStudied)) indicesNotZero = np.array(np.nonzero(tilesStudied))
if (0 not in indicesNotZero) : if (0 not in indicesNotZero) :
myGrid.grid[3*blockToStudy,columnToStudy] = i tileToModify = myGrid.getTile(3*blockToStudy,columnToStudy)
#myGrid.grid[3*blockToStudy,columnToStudy] = i
elif (1 not in indicesNotZero) : elif (1 not in indicesNotZero) :
myGrid.grid[3*blockToStudy+1,columnToStudy] = i tileToModify = myGrid.getTile(3*blockToStudy+1,columnToStudy)
#myGrid.grid[3*blockToStudy+1,columnToStudy] = i
else : else :
myGrid.grid[3*blockToStudy+2,columnToStudy] = i tileToModify = myGrid.getTile(3*blockToStudy+2,columnToStudy)
#print("modified : ", i) #myGrid.grid[3*blockToStudy+2,columnToStudy] = i
tileToModify.modifyValue(tileToModify.xIndex, tileToModify.yIndex, i)
#il reste encore à gérer le cas où les deux autres tuiles ont encore plusieurs possibilités mais qu'on peut quand même conclure #il reste encore à gérer le cas où les deux autres tuiles ont encore plusieurs possibilités mais qu'on peut quand même conclure
#horizontally #horizontally
...@@ -150,14 +184,18 @@ class Grid (object) : ...@@ -150,14 +184,18 @@ class Grid (object) :
if (np.count_nonzero(tilesStudied) == 2) : if (np.count_nonzero(tilesStudied) == 2) :
indicesNotZero = np.array(np.nonzero(tilesStudied)) indicesNotZero = np.array(np.nonzero(tilesStudied))
if (0 not in indicesNotZero) : if (0 not in indicesNotZero) :
myGrid.grid[lineToStudy, 3*blockToStudy] = i tileToModify = myGrid.getTile(lineToStudy, 3*blockToStudy)
#myGrid.grid[lineToStudy, 3*blockToStudy] = i
elif (1 not in indicesNotZero) : elif (1 not in indicesNotZero) :
myGrid.grid[lineToStudy, 3*blockToStudy+1] = i tileToModify = myGrid.getTile(lineToStudy, 3*blockToStudy+1)
#myGrid.grid[lineToStudy, 3*blockToStudy+1] = i
else : else :
myGrid.grid[lineToStudy, 3*blockToStudy+2] = i tileToModify = myGrid.getTile(lineToStudy, 3*blockToStudy+2)
#print("modified : ", i) #myGrid.grid[lineToStudy, 3*blockToStudy+2] = i
tileToModify.modifyValue(tileToModify.xIndex, tileToModify.yIndex, i)
#il reste encore à gérer le cas où les deux autres tuiles ont encore plusieurs possibilités mais qu'on peut quand même conclure #il reste encore à gérer le cas où les deux autres tuiles ont encore plusieurs possibilités mais qu'on peut quand même conclure
class Block (object) : class Block (object) :
def __init__ (self, block, xIndex, yIndex) : def __init__ (self, block, xIndex, yIndex) :
...@@ -251,26 +289,74 @@ class Tile (object) : ...@@ -251,26 +289,74 @@ class Tile (object) :
def evaluate(self) : def evaluate(self) :
""" gets the neighbors using getNeighbors """ gets the neighbors using getNeighbors
checks if there is only one missing, in that case we modify the tiles checks if there is only one missing, in that case we modify the tiles
doesn't return anything doesn't return anything, except -1 if tile is not 0
""" """
if (self.value == 0) : if (self.value != 0) :
neighbors = np.array(self.getNeighbors()) return -1
if (len(neighbors) == 8) :
for k in range(1,9) :
if k not in neighbors :
myGrid.grid[self.xIndex, self.yIndex] = k
#we first check if there is only one possibility in the tempGrid
possibilitiesNonZero = np.trim_zeros(myGrid.tempGrid[self.xIndex, self.yIndex])
if (len(possibilitiesNonZero) == 1) :
self.modifyValue(self.xIndex, self.yIndex, myGrid.tempGrid[self.xIndex, self.yIndex, 0])
########################################### #we now compute the neighbors as usual
neighbors = np.array(self.getNeighbors())
if (len(neighbors) == 8) :
for k in range(1,10) :
if k not in neighbors :
#we modify the value of the tile
self.modifyValue(self.xIndex, self.yIndex, k)
else :
for k in range(1,10) :
if (k not in neighbors) and (k not in myGrid.tempGrid[self.xIndex, self.yIndex]) :
someArray = np.delete(myGrid.tempGrid[self.xIndex, self.yIndex], 8)
myGrid.tempGrid[self.xIndex, self.yIndex] = np.append(k, someArray)
# TEST_GRID = np.zeros((9,9))
# compteur = 0 def modifyValue (self, xIndex, yIndex, value) :
# for k in range (9) : """ Once we found the value of a tile, we modify it
# for i in range(9) : We also modify the possible values of all of the neighbors of the tile
# TEST_GRID[i, k] = compteur """
# compteur += 1 #we modify the value of the tile
myGrid.grid[self.xIndex, self.yIndex] = value
myGrid.tempGrid[self.xIndex, self.yIndex, 0] = value
myGrid.tempGrid[self.xIndex, self.yIndex, 1:9] = 0
#we modify the possible values of the neighbors : block
xIndexBlock = self.yIndex//3
yIndexBlock = self.xIndex//3
for k in range (3) :
for i in range (3) :
possibleTileValuesList = list(myGrid.tempGrid[3*xIndexBlock+k, 3*yIndexBlock+i])
if (value in possibleTileValuesList) :
#in that case we have to remove "value" from the possibilities
possibleTileValuesList.remove(value)
possibleTileValuesList.append(0)
myGrid.tempGrid[3*xIndexBlock+k, 3*yIndexBlock+i] = np.array(possibleTileValuesList)
#we modify the possible values of the neighbors : line
for k in range (9) :
possibleTileValuesList = list(myGrid.tempGrid[xIndex, k])
if (value in possibleTileValuesList) :
#in that case we have to remove "value" from the possibilities
possibleTileValuesList.remove(value)
possibleTileValuesList.append(0)
myGrid.tempGrid[xIndex, k] = np.array(possibleTileValuesList)
#we modify the possible values of the neighbors : column
# for k in range (9) :
possibleTileValuesList = list(myGrid.tempGrid[k, yIndex])
if (value in possibleTileValuesList) :
#in that case we have to remove "value" from the possibilities
possibleTileValuesList.remove(value)
possibleTileValuesList.append(0)
myGrid.tempGrid[k, yIndex] = np.array(possibleTileValuesList)
###########################################
# TEST_GRID = np.array([[ 0, 4, 7, 27, 36, 45, 54, 63, 72.], # TEST_GRID = np.array([[ 0, 4, 7, 27, 36, 45, 54, 63, 72.],
# [ 1, 5, 8, 28, 37, 46, 55, 64, 73.], # [ 1, 5, 8, 28, 37, 46, 55, 64, 73.],
# [ 2, 6, 3, 29, 38, 47, 56, 65, 74.], # [ 2, 6, 3, 29, 38, 47, 56, 65, 74.],
...@@ -281,44 +367,48 @@ class Tile (object) : ...@@ -281,44 +367,48 @@ class Tile (object) :
# [ 7, 2, 5, 34, 43, 52, 61, 70, 79.], # [ 7, 2, 5, 34, 43, 52, 61, 70, 79.],
# [ 8, 3, 9, 35, 44, 53, 62, 71, 80.]]) # [ 8, 3, 9, 35, 44, 53, 62, 71, 80.]])
TEST_GRID_1 = np.array([[ 0, 0, 0, 4, 0, 0, 8, 7, 0.],
TEST_GRID = np.array([[ 0, 0, 0, 4, 0, 0, 8, 7, 0.], [ 0, 4, 7, 0, 9, 2, 0, 5, 0.],
[ 0, 4, 7, 0, 9, 2, 0, 5, 0.], [ 2, 0, 0, 6, 0, 0, 0, 3, 0.],
[ 2, 0, 0, 6, 0, 0, 0, 3, 0.], [ 9, 7, 0, 5, 0, 0, 2, 0, 3.],
[ 9, 7, 0, 5, 0, 0, 2, 0, 3.], [ 5, 0, 8, 0, 2, 4, 7, 0, 6.],
[ 5, 0, 8, 0, 2, 4, 7, 0, 6.], [ 6, 0, 4, 0, 0, 7, 0, 8, 5.],
[ 6, 0, 4, 0, 0, 7, 0, 8, 5.], [ 0, 9, 0, 3, 0, 8, 0, 0, 7.],
[ 0, 9, 0, 3, 0, 8, 0, 0, 7.], [ 0, 0, 3, 2, 4, 0, 1, 6, 0.],
[ 0, 0, 3, 2, 4, 0, 1, 6, 0.], [ 0, 1, 2, 0, 0, 0, 0, 9, 0.]])
[ 0, 1, 2, 0, 0, 0, 0, 9, 0.]])
TEST_GRID_2 = np.array([[ 0, 3, 2, 0, 8, 0, 0, 0, 0.],
[ 8, 0, 1, 0, 0, 0, 9, 0, 3.],
# TEST_GRID = np.array([[ 0, 3, 2, 0, 8, 0, 0, 0, 0.], [ 0, 0, 0, 6, 0, 3, 0, 0, 0.],
# [ 8, 0, 1, 0, 0, 0, 9, 0, 3.], [ 0, 2, 0, 0, 5, 7, 4, 0, 6.],
# [ 0, 0, 0, 6, 0, 3, 0, 0, 0.], [ 5, 0, 0, 4, 0, 6, 0, 0, 2.],
# [ 0, 2, 0, 0, 5, 7, 4, 0, 6.], [ 7, 0, 4, 8, 3, 0, 0, 9, 0.],
# [ 5, 0, 0, 4, 0, 6, 0, 0, 2.], [ 0, 0, 0, 5, 0, 1, 0, 0, 0.],
# [ 7, 0, 4, 8, 3, 0, 0, 9, 0.], [ 0, 0, 8, 0, 0, 0, 7, 0, 1.],
# [ 0, 0, 0, 5, 0, 1, 0, 0, 0.], [ 4, 0, 0, 0, 7, 0, 6, 3, 0.]])
# [ 0, 0, 8, 0, 0, 0, 7, 0, 1.],
# [ 4, 0, 0, 0, 7, 0, 6, 3, 0.]]) TEST_GRID_3 = np.array([[ 8, 0, 0, 0, 0, 0, 0, 0, 0.],
[ 0, 0, 3, 0, 0, 0, 0, 0, 0.],
[ 0, 7, 0, 6, 9, 0, 2, 0, 0.],
[ 0, 5, 0, 0, 0, 7, 0, 0, 0.],
[ 0, 0, 0, 0, 4, 5, 7, 0, 0.],
[ 0, 0, 0, 1, 0, 0, 0, 9, 0.],
[ 0, 0, 1, 0, 0, 0, 0, 0, 8.],
[ 0, 0, 8, 5, 0, 0, 0, 0, 0.],
[ 0, 9, 0, 0, 0, 0, 4, 3, 0.]])
TEST_GRID = TEST_GRID_3
myGrid = Grid(copy.deepcopy(TEST_GRID)) myGrid = Grid(copy.deepcopy(TEST_GRID))
compteur = 0
while (myGrid.verify() != True and compteur<5) :
compteur+=1
for k in range (9) :
for i in range (9) :
myGrid.searchForTwoOutOfThree()
someTile = myGrid.getTile(i,k)
someTile.evaluate()
for k in range (9) :
for i in range (9) :
myGrid.searchForTwoOutOfThree()
someTile = myGrid.getTile(i,k)
someTile.evaluate()
for k in range (9) :
for i in range (9) :
myGrid.searchForTwoOutOfThree()
someTile = myGrid.getTile(i,k)
someTile.evaluate()
print(myGrid)
#print(Grid(myGrid.grid - TEST_GRID)) #print(Grid(myGrid.grid - TEST_GRID))
print(myGrid)
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment