2022/06/Main.idr

37 lines
1.1 KiB
Idris

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