There are some symmetries which must be satisfied:
pattern0 = [1,1,1,0,-1,-1,-1,0]
pattern1 = [0,1,1,1,0,-1,-1,-1]
pattern2 = [-1,0,1,1,1,0,-1,-1]
pattern3 = [-1,-1,0,1,1,1,0,-1]
pattern4 = [3,4,3,4,3,4,3,4]
pattern5 = [1,1,1,0,0,0,0,0,0]
pattern6 = [0,1,1,1,0,0,0,0,0]
symmetry :: [Int] -> [Int] -> Int
symmetry lengths pattern = sum [ (lengths !! i) * (pattern !! i) | i <- [0..7] ]
-- the desired bounds on coordinates are [0..30] not [8..12]
good0 = [ [l0,l1,l2,l3,l4,l5,l6,l7] | l0 <- [8..12], l1 <- [8..12],
l2 <- [8..12], l3 <- [8..12],
l4 <- [8..12], l5 <- [8..12],
l6 <- [8..12], l7 <- [8..12] ]
good1 = filter symmetryZeroHolds good0
where symmetryZeroHolds lengths = (symmetry pattern0 lengths == 0)
good2 = filter symmetryOneHolds good1
where symmetryOneHolds lengths = (symmetry pattern1 lengths == 0)
good3 = filter symmetryOneHolds good2
where symmetryOneHolds lengths = (symmetry pattern2 lengths == 0)
good4 = filter symmetryOneHolds good3
where symmetryOneHolds lengths = (symmetry pattern3 lengths == 0)
good5 = filter potential288 good4
where potential288 lengths = (8 + symmetry pattern4 lengths == 288)
good6 = filter maxCoordinate good5
where maxCoordinate lengths = (lengths !! 0 == maximum lengths)
good7 = filter symmetryOneHolds good6
where symmetryOneHolds lengths = (symmetry pattern5 lengths >= 10)
good8 = filter symmetryOneHolds good7
where symmetryOneHolds lengths = (symmetry pattern6 lengths >= 10)
main = do
print (take 10000 good8)
print (length good8)