dots 0 = [ [ 0, 0, 0 ] ] dots generation = let axis = case mod generation 4 of 0 -> [ 1,1,1 ] 1 -> [ 1,1,-1 ] 2 -> [ 1,1,-1 ] 3 -> [ 1,-1,-1 ] indots = dots (-1+generation) aboves = [ zipWith(+) xyz axis | xyz <- indots ] belows = [ zipWith(-) xyz axis | xyz <- indots ] diffx m w | null w = m | null m = w diffx m w = case head m `compare` head w of EQ -> tail m `diffx` tail w LT -> head m : diffx (tail m) w GT -> head w : diffx m (tail w) in belows `diffx` indots `diffx` aboves main = sequence_ [ writeFile (show generation ++ ".pgm") ("P5 900 900 1\n" ++ [ if [ -7 + div j 60, -7 + div k 60, -7 + div (min (min (mod j 60) (60 - mod j 60)) (min (mod k 60) (60 - mod k 60)) ) 2 ] `elem` lights then '\1' else '\0' | j <- [0..899], k <- [0..899] ]) | generation <- [0..19], let lights = dots generation ]