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 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)]