diff --git a/pieces.py b/pieces.py --- a/pieces.py +++ b/pieces.py @@ -1,10 +1,6 @@ import numpy as np -board=[[0]*4 for r in range(3)] -steamboat=[[0,0,0],[1,1,1],[0,1,0]] - - def rotate(obj,axis,multiple): """[ # z [[1,2,3], # y,x @@ -25,7 +21,7 @@ def rotate(obj,axis,multiple): shape_=abs(np.dot(shape,m)) middle=(shape-1)/2 middle_=(shape_-1)/2 - res=np.zeros(shape_) + res=np.zeros(shape_,np.int32) for (z,plane) in enumerate(obj): for (y,row) in enumerate(plane): @@ -37,8 +33,35 @@ def rotate(obj,axis,multiple): return res -def fits(board,piece,offset): - (dz,dy,dx)=offset +def listRotations(obj): + rots=[(0,0),(1,1),(1,2),(1,3),(2,1),(2,3)] + res=[] + configs=set() + + for (axis,multiple) in rots: # každou stěnu natočíme nahoru + obj_=rotate(obj,axis,multiple) + for i in range(4): # a protočíme kolem z + obj__=rotate(obj_,0,i) + + h=(obj__.shape,obj__.tobytes()) # zbavíme se symetrií + if h not in configs: + res.append(obj__) + configs.add(h) + + return res + + +def listShifts(board,obj): + return [ + (dz,dy,dx) + for dz in range(board.shape[0]-obj.shape[0]+1) + for dy in range(board.shape[1]-obj.shape[1]+1) + for dx in range(board.shape[2]-obj.shape[2]+1) + ] + + +def fits(board,piece,shift): + (dz,dy,dx)=shift res=[] for (z,plane) in enumerate(piece): @@ -46,24 +69,22 @@ def fits(board,piece,offset): for (x,item) in enumerate(row): if item==0: continue coords=(z+dz,y+dy,x+dx) - if board[coords]: return None + if board[coords]: return False res.append(coords) return res if __name__=="__main__": - # for r in range(-2,3): - # for c in range(-2,4): - # x=fits(board,steamboat,(r,c)) - # if x: print((r,c),x) + board=np.zeros((1,2,3)) + boat=np.array([[[0,1,0],[1,1,1]]]) + es=np.array([[[1,1,0],[0,1,1]]]) + el=np.array([[[1,1,1],[1,0,0]]]) - # print(rotZ([[0,1,0,0],[0,1,0,0],[0,1,0,0],[0,0,0,0]])) + pieces={"boat":boat} - arr=np.array([ # z - [[1,2,3], # y,x - [4,5,6]], - - [[7,8,9], - [10,11,12]] - ]) - print(rotate(arr,2,4)) + for (name,piece) in pieces.items(): + for p in listRotations(piece): + for shift in listShifts(board,p): + fit=fits(board,p,shift) + if fit is not False: + print(fit)