37 lines
1.1 KiB
Idris
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
|