import numpy as np
from pieces import listRotations,listShifts,fits
from dlx import Header,Column,Cell
board=np.zeros((1,4,3))
boat=np.array([[[0,1,0],[1,1,1]]])
sz=np.array([[[1,1,0],[0,1,1]]])
el=np.array([[[1,1,1],[1,0,0]]])
(nz,ny,nx)=board.shape
pieces=[("el1",el),("el2",el),("sz",sz)]
header=[name for (name,p) in pieces]+\
[(z,y,x) for z in range(nz) for y in range(ny) for x in range(nx) if not board[z][y][x]]
index={label:i for (i,label) in enumerate(header)}
matrix=[]
for (name,piece) in pieces:
for p in listRotations(piece):
for shift in listShifts(board,p):
fit=fits(board,p,shift)
if fit is not False:
row=[0]*len(header)
row[index[name]]=1
for coords in fit: row[index[coords]]=1
matrix.append(row)
# print(header)
# for row in matrix: print(row)
columns=[]
head=Header()
for label in header:
c=Column(label)
head.left.right=c
c.left=head.left
head.left=c
c.right=head
columns.append(c)
for row in matrix:
cells=[]
for (item,col) in zip(row,columns):
if item!=1: continue
c=Cell(up=col.up,down=col,col=col)
col.up.down=c
col.up=c
cells.append(c)
c.right=cells[0]
c.left=cells[0].left
c.left.right=c
c.right.left=c
head.search()