advent-of-code/2020/day3/day3.hs

30 lines
1.1 KiB
Haskell
Raw Normal View History

2020-12-03 22:33:03 +01:00
import Control.Applicative (empty)
import Control.Monad.Zip (mzip)
import Data.List (intercalate)
import Data.Maybe (catMaybes)
compose2 :: (a' -> b' -> c) -> (a -> a') -> (b -> b') -> a -> b -> c
compose2 f g h x y = f (g x) (h y)
(.:) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
f .: g = (f .) . g
infixl 8 .:
countHits :: (Int, Int) -> [[Bool]] -> Int
countHits = length . filterMap lookup . catMaybes .: compose2 (zipWith mzip) maybeIndices justLines
where justRightSteps = map (pure . Just) . enumFromThen 0
downNothings = flip replicate Nothing . pred
maybeIndices = uncurry $ compose2 (flip intercalate) justRightSteps downNothings
justLines = map Just
lookup = uncurry $ flip (!!)
filterMap = filter id .: map
2020-12-03 22:33:03 +01:00
treeCharToBool :: Char -> Bool
treeCharToBool = (== '#')
main = do
charLines <- lines <$> readFile "input.txt"
let boolLines = cycle <$> map treeCharToBool <$> charLines
print $ countHits (3, 1) boolLines
print $ product $ flip countHits boolLines <$> [(1,1), (3,1), (5,1), (7,1), (1,2)]