diff --git a/06/Main.idr b/06/Main.idr index fcb8150..390668e 100644 --- a/06/Main.idr +++ b/06/Main.idr @@ -13,30 +13,44 @@ windows {n} xs = Nothing => [] (Just x) => x :: windows tail -findStartOfPacket : List Char -> Maybe Nat -findStartOfPacket cs = - let segments = windows {n = 4} cs - in case findIndex (\x => let ( p ** _ ) = nub x in p == 4) segments of +findStart : Nat -> List Char -> Maybe Nat +findStart n cs = + let segments = windows {n} cs + in case findIndex (\x => let ( p ** _ ) = nub x in p == n) segments of Nothing => Nothing - (Just x) => Just $ finToNat x + 4 + (Just x) => Just $ finToNat x + n -testCases : List (String, Nat) -testCases = [("mjqjpqmgbljsphdztnvjfqwrcgsmlb", 7), - ("bvwbjplbgvbhsrlpgdmjqwftvncz",5), - ("nppdvjthqldpwncqszvftbrmjlhg",6), - ("nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg",10), - ("zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw",11)] +findStartOfPacket : List Char -> Maybe Nat +findStartOfPacket = findStart 4 -testCase : (String, Nat) -> IO Bool -testCase (string, start) = +findStartOfMessage : List Char -> Maybe Nat +findStartOfMessage = findStart 14 + +testCases : List (String, Nat, Nat) +testCases = [("mjqjpqmgbljsphdztnvjfqwrcgsmlb", 7, 19), + ("bvwbjplbgvbhsrlpgdmjqwftvncz", 5, 23), + ("nppdvjthqldpwncqszvftbrmjlhg", 6, 23), + ("nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg", 10, 29), + ("zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw", 11, 26)] + +testCase : (String, Nat, Nat) -> IO Bool +testCase (string, start, message) = do putStrLn $ "Test Case: " ++ string - putStrLn $ "Expected Start: " ++ show start + putStrLn $ "Expected Start of packet: " ++ show start + putStrLn $ "Expected Start of message: " ++ show message let result = findStartOfPacket (unpack string) - putStrLn $ "Evaluated start: " ++ show result + let messageResult = findStartOfMessage (unpack string) + putStrLn $ "Evaluated start of packet: " ++ show result + putStrLn $ "Evaluated start of message: " ++ show messageResult let result = not (result == Just start) - if result - then putStrLn "Test Failed!!!" - else putStrLn "Test Passed" + result <- if result + then do putStrLn "Test Failed!!!" + pure True + else if messageResult == Just message + then do putStrLn "Test Passed" + pure False + else do putStrLn "Test Failed!!!" + pure True putStrLn "" pure result @@ -53,4 +67,9 @@ main = putStrLn $ case findStartOfPacket (unpack contents) of Just start => show start Nothing => "Failed to find start" + putStr "Part 2: " + putStrLn $ case findStartOfMessage (unpack contents) of + Just start => show start + Nothing => "Failed to find start" + Left err => printLn err