main :: IO () main = do raw <- readFile "day3.txt" let ls = map parse $ lines raw ansA = solveSlope 3 1 ls ansB = foldr (*) 1 $ [ (solveSlope 1 1 ls) , (solveSlope 3 1 ls) , (solveSlope 5 1 ls) , (solveSlope 7 1 ls) , (solveSlope 1 2 ls) ] in do putStrLn $ "day3a: " ++ (show ansA) putStrLn $ "day3b: " ++ (show ansB) parse :: String -> [Bool] parse = map (== '#') solveLine :: [Bool] -> Int -> Bool solveLine [] _ = error "empty list" solveLine bs i = bs !! index where index = i `mod` (length bs) solveSlope :: Int -> Int -> [[Bool]] -> Int solveSlope r d bs = length $ filter (== True) $ solveSlope' r d bs 0 [] solveSlope' :: Int -> Int -> [[Bool]] -> Int -> [Bool] -> [Bool] solveSlope' _ _ [] _ as = as solveSlope' r d bs@(b:cs) i as = if ns == [] then as else solveSlope' r d ns ni $ (solveLine (head ns) ni) : as where ni = (i + r) `mod` (length b) ns = if (length bs) <= d then [] else (drop d bs)