diff options
-rw-r--r-- | 4-1.hs | 45 |
1 files changed, 45 insertions, 0 deletions
@@ -0,0 +1,45 @@ +import Control.Monad (ap) + +transpose :: [[a]] -> [[a]] +transpose ([]:_) = [] +transpose xss = map head xss : transpose (map tail xss) + +diagonals :: Eq a => [[a]] -> [[a]] +diagonals a = + let n = length a + m = length (head a) + in + [[ a!!x!!(d-x) | x <- [max 0 (d-m+1) .. min (n-1) d] ] + | d <- [0..n+m-1]] + +reverseRows :: [[a]] -> [[a]] +reverseRows = map reverse + +ts :: Eq a => [[[a]] -> [[a]]] +ts = [ id + , reverseRows + , transpose + , reverseRows . transpose + , diagonals + , reverseRows . diagonals + , diagonals . reverseRows + , reverseRows . diagonals . reverseRows + ] + +transforms :: Eq a => [[a]] -> [[[a]]] +transforms = ap ts . pure + +count :: Eq a => [a] -> [a] -> Integer +count = count' 0 + +count' :: Eq a => Integer -> [a] -> [a] -> Integer +count' n _ [] = n +count' n s xs = if take (length s) xs == s + then count' (n+1) s (drop (length s) xs) + else count' n s (tail xs) + +result :: [String] -> Integer +result = sum . map (sum . map (count "XMAS")) . transforms + +main :: IO () +main = getContents >>= print . result . lines |