37 lines
924 B
Haskell
37 lines
924 B
Haskell
module Main where
|
|
|
|
import qualified AoC as A (diagonals, subArrays)
|
|
import Data.List (isPrefixOf, tails, transpose)
|
|
|
|
part1 :: [[Char]] -> Int
|
|
part1 grid =
|
|
(sum . concatMap countXmas)
|
|
[ grid,
|
|
transpose grid,
|
|
A.diagonals grid,
|
|
A.diagonals $ map reverse grid
|
|
]
|
|
where
|
|
countXmas :: [[Char]] -> [Int]
|
|
countXmas = map (length . filter ((||) <$> isPrefixOf "XMAS" <*> isPrefixOf "SAMX") . tails)
|
|
|
|
part2 :: [[Char]] -> Int
|
|
part2 grid =
|
|
let groups = concat $ A.subArrays 3 $ transpose $ A.subArrays 3 grid
|
|
in length $ filter check groups
|
|
where
|
|
check :: [[Char]] -> Bool
|
|
check
|
|
[ [a, _, b],
|
|
[_, 'A', _],
|
|
[c, _, d]
|
|
] = elem [a, d] ["MS", "SM"] && elem [b, c] ["MS", "SM"]
|
|
check _ = False
|
|
|
|
main :: IO ()
|
|
main =
|
|
do
|
|
raw <- lines <$> readFile "./inputs/day4.in"
|
|
putStr "Part 1: " >> print (part1 raw)
|
|
putStr "Part 2: " >> print (part2 raw)
|