{-# LANGUAGE LambdaCase #-} module Main where import Data.Functor import Data.List import Data.Universe.Helpers import Text.Regex.PCRE import Data.Function import Debug.Trace parse1 :: String -> [String] parse1 a = let x = lines a x' = x <&> reverse in x ++ -- vertical ⇒ x' ++ -- vertical ⇐ transpose x ++ -- horizontal ⇓ (transpose x <&> reverse) ++ -- horizontal ⇓ diagonals x ++ -- diagonal ⇗ diagonals x' ++ -- diagonal ⇖ (diagonals x <&> reverse) ++ -- diagonal ⇙ (diagonals x'<&> reverse) -- diagonal ⇘ solve1 :: [String] -> Int solve1 = sum . (length . (getAllTextMatches . (=~ "XMAS") :: String -> [String]) <$>) pattern2 :: Int -> String pattern2 i = let i' = i-2 in "M.M.{"++ show i' ++"}.A..{" ++ show i' ++ "}S.S|" ++ "M.S.{"++ show i' ++"}.A..{" ++ show i' ++ "}M.S|" ++ "S.M.{"++ show i' ++"}.A..{" ++ show i' ++ "}S.M|" ++ "S.S.{"++ show i' ++"}.A..{" ++ show i' ++ "}M.M" solve2 :: String -> Int solve2 s = let l = length . head . lines $ s in let t = (getAllTextSubmatches . (=~ pattern2 l) :: String -> [String]) . intercalate "U" . lines <$> tails s t' = nub . concat $ t in length t' main :: IO () main = readFile "inputs/4" >>= \i -> print (solve1 $ parse1 i) >> print (solve2 i)