import Data.List main :: IO () main = do input <- readFile "input" let grid = lines input let n = countGrid grid "XMAS" print n -- mapM_ print (rotGrid (transpose grid)) countGrid grid s = let revS = reverse s gridT = transposeGrid grid gridRot = rotGrid grid gridRotT = rotGrid (reverse grid) in (count grid s) + (count grid revS) + (count gridT s) + (count gridT revS) + (count gridRot s) + (count gridRot revS) + (count gridRotT s) + (count gridRotT revS) where count g s = sum $ map (countOcc s) g countOcc s line = if line == "" then 0 else if s `isPrefixOf` line then 1 + countOcc s (drop (length s) line) else countOcc s (tail line) transposeGrid grid = let n = length grid - 1 m = length (grid!!0) - 1 in [[grid!!i!!j | i <- [0..n]] | j <- [0..m]] shiftGrid grid = let n = length grid - 1 m = length (grid!!0) - 1 ind i j = if i >= 0 && i <= n && j >= 0 && j <= m then grid!!i!!j else ' ' in [[ind i (j-i) | j <- [0..n+m]] | i <- [0..n]] rotGrid = transposeGrid . shiftGrid