22 lines
602 B
Haskell
22 lines
602 B
Haskell
import Data.List
|
|
import Control.Monad
|
|
import Control.Arrow
|
|
import Data.Maybe
|
|
|
|
states=" Ht."
|
|
shiftS=" t.."
|
|
|
|
borden bc xs = bs: (map (\x -> bc:(x++[bc])) xs) ++ [bs]
|
|
where r = length $ head xs
|
|
bs = replicate (r+2) bc
|
|
|
|
take3x3 = ap ((.). taken. length) (taken. length. head) `ap` borden '*'
|
|
where taken n = transpose. map (take n.map (take 3)).map tails
|
|
|
|
nwState xs | e =='.' && noH>0 && noH<3 = 'H'
|
|
| otherwise = shiftS !! (fromJust $ elemIndex e states)
|
|
where e = xs!!1!!1
|
|
noH = length $ filter (=='H') $ concat xs
|
|
|
|
runCircuit = iterate (map(map nwState).take3x3)
|