import Data.Vect import Data.List import Data.Fin import System.File.ReadWrite -- Get windows of a specific size over the data windows : {n : Nat} -> List a -> List (Vect n a) windows [] = [] windows {n} xs = let (head, _) = splitAt n xs tail = drop 1 xs in case toVect n head of Nothing => [] (Just x) => x :: windows tail 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 + n main : IO () main = do file <- readFile "input" case file of Right contents => do putStr "Part 1: " putStrLn $ case findStart 4 (unpack contents) of Just start => show start Nothing => "Failed to find start" putStr "Part 2: " putStrLn $ case findStart 14 (unpack contents) of Just start => show start Nothing => "Failed to find start" Left err => printLn err