Day 6 done
[advent-of-code-22.git] / advent06 / Main.hs
1 -- Writeup at https://work.njae.me.uk/2022/12/06/advent-of-code-2022-day-6/
2
3 import System.Environment
4 import Data.List
5
6 -- test = "mjqjpqmgbljsphdztnvjfqwrcgsmlb"
7
8 main :: IO ()
9 main =
10 do dataFileName <- getDataFileName
11 text <- readFile dataFileName
12 -- print $ part1 test
13 -- print $ part2 test
14 print $ part1 text
15 print $ part2 text
16
17 getDataFileName :: IO String
18 getDataFileName =
19 do args <- getArgs
20 progName <- getProgName
21 let baseDataName = if null args
22 then progName
23 else head args
24 let dataFileName = "data/" ++ baseDataName ++ ".txt"
25 return dataFileName
26
27 part1 :: String -> Int
28 part1 = interestingPosition 4
29
30 part2 :: String -> Int
31 part2 = interestingPosition 14
32
33 interestingPosition :: Int -> String -> Int
34 interestingPosition n text = n + (fst packetPos)
35 where candidates = zip [0..] $ fmap (take n) $ tails text
36 packetPos = head $ dropWhile (hasSame . snd) candidates
37
38 allDifferent, hasSame :: String -> Bool
39 allDifferent cs = nub cs == cs
40 hasSame = not . allDifferent