module Day01 ( day01_1, day01_2, ) where parseInput :: IO [String] parseInput = do lines <$> readFile "input/day1.txt" rotate :: Int -> String -> Int rotate n ('L' : xs) = (n - read xs) `mod` 100 rotate n ('R' : xs) = (n + read xs) `mod` 100 rotate n _ = n rotate' :: Int -> String -> (Int, Int) rotate' 0 ('L' : xs) = (negate (read xs) `mod` 100, (read xs + 100) `div` 100 - 1) rotate' n ('L' : xs) = ((n - read xs) `mod` 100, (read xs - n + 100) `div` 100) rotate' n ('R' : xs) = ((n + read xs) `mod` 100, (read xs + n) `div` 100) rotate' n _ = (n, 0) getPassword :: Int -> Int -> [String] -> Int getPassword pass 0 [] = pass + 1 getPassword pass _ [] = pass getPassword pass 0 (x : xs) = getPassword (pass + 1) (rotate 0 x) xs getPassword pass curr (x : xs) = getPassword pass (rotate curr x) xs getPassword' :: Int -> Int -> [String] -> Int getPassword' pass _ [] = pass getPassword' pass curr (x : xs) = getPassword' newPass newVal xs where (newVal, nZero) = rotate' curr x newPass = pass + nZero day01_1 :: IO () day01_1 = do input <- parseInput let result = getPassword 0 50 input putStrLn $ "Day 1, Puzzle 1 solution: " ++ show result day01_2 :: IO () day01_2 = do input <- parseInput let result = getPassword' 0 50 input putStrLn $ "Day 1, Puzzle 2 solution: " ++ show result