diff --git a/app/Main.hs b/app/Main.hs index edb575b..3210c94 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -30,4 +30,4 @@ import qualified Day24 import qualified Day25 main :: IO () -main = Day06.main +main = Day07.main diff --git a/input/07.txt b/input/07.txt new file mode 100644 index 0000000..3af30e3 --- /dev/null +++ b/input/07.txt @@ -0,0 +1,101 @@ +Step G must be finished before step M can begin. +Step T must be finished before step E can begin. +Step P must be finished before step M can begin. +Step V must be finished before step L can begin. +Step Y must be finished before step B can begin. +Step K must be finished before step Z can begin. +Step H must be finished before step I can begin. +Step D must be finished before step U can begin. +Step C must be finished before step L can begin. +Step R must be finished before step Z can begin. +Step U must be finished before step B can begin. +Step J must be finished before step M can begin. +Step M must be finished before step E can begin. +Step I must be finished before step X can begin. +Step N must be finished before step O can begin. +Step S must be finished before step F can begin. +Step X must be finished before step A can begin. +Step F must be finished before step Q can begin. +Step B must be finished before step Z can begin. +Step Q must be finished before step W can begin. +Step L must be finished before step W can begin. +Step O must be finished before step Z can begin. +Step A must be finished before step Z can begin. +Step E must be finished before step W can begin. +Step W must be finished before step Z can begin. +Step G must be finished before step R can begin. +Step H must be finished before step A can begin. +Step A must be finished before step W can begin. +Step Y must be finished before step D can begin. +Step O must be finished before step A can begin. +Step V must be finished before step U can begin. +Step H must be finished before step W can begin. +Step K must be finished before step F can begin. +Step J must be finished before step X can begin. +Step V must be finished before step R can begin. +Step Q must be finished before step A can begin. +Step F must be finished before step B can begin. +Step G must be finished before step P can begin. +Step L must be finished before step A can begin. +Step B must be finished before step Q can begin. +Step H must be finished before step J can begin. +Step J must be finished before step L can begin. +Step F must be finished before step E can begin. +Step U must be finished before step A can begin. +Step G must be finished before step Q can begin. +Step G must be finished before step S can begin. +Step K must be finished before step J can begin. +Step N must be finished before step B can begin. +Step F must be finished before step O can begin. +Step C must be finished before step Z can begin. +Step B must be finished before step E can begin. +Step M must be finished before step S can begin. +Step A must be finished before step E can begin. +Step E must be finished before step Z can begin. +Step K must be finished before step I can begin. +Step P must be finished before step A can begin. +Step Y must be finished before step L can begin. +Step Y must be finished before step J can begin. +Step G must be finished before step N can begin. +Step Q must be finished before step L can begin. +Step D must be finished before step X can begin. +Step C must be finished before step I can begin. +Step K must be finished before step B can begin. +Step N must be finished before step F can begin. +Step D must be finished before step M can begin. +Step B must be finished before step A can begin. +Step U must be finished before step J can begin. +Step Q must be finished before step Z can begin. +Step X must be finished before step F can begin. +Step K must be finished before step X can begin. +Step U must be finished before step E can begin. +Step X must be finished before step W can begin. +Step K must be finished before step Q can begin. +Step I must be finished before step E can begin. +Step D must be finished before step J can begin. +Step P must be finished before step I can begin. +Step K must be finished before step D can begin. +Step S must be finished before step X can begin. +Step C must be finished before step R can begin. +Step P must be finished before step W can begin. +Step I must be finished before step O can begin. +Step S must be finished before step O can begin. +Step K must be finished before step C can begin. +Step N must be finished before step Q can begin. +Step L must be finished before step E can begin. +Step L must be finished before step Z can begin. +Step K must be finished before step W can begin. +Step Y must be finished before step A can begin. +Step L must be finished before step O can begin. +Step N must be finished before step W can begin. +Step R must be finished before step W can begin. +Step C must be finished before step O can begin. +Step H must be finished before step X can begin. +Step V must be finished before step Y can begin. +Step S must be finished before step W can begin. +Step V must be finished before step E can begin. +Step Q must be finished before step E can begin. +Step P must be finished before step H can begin. +Step V must be finished before step H can begin. +Step N must be finished before step Z can begin. +Step C must be finished before step A can begin. diff --git a/package.yaml b/package.yaml index 38b8281..c9d7cf1 100644 --- a/package.yaml +++ b/package.yaml @@ -23,6 +23,7 @@ dependencies: - base >= 4.7 && < 5 - containers - text +- extra library: source-dirs: src diff --git a/src/Day07.hs b/src/Day07.hs index be411b9..527c385 100644 --- a/src/Day07.hs +++ b/src/Day07.hs @@ -1,6 +1,28 @@ module Day07 (main) where +import Data.Map (Map, fromListWith, fromList, findMin) +import qualified Data.Map as M (union, null, filter, delete) +import Data.Set (Set, singleton, empty) +import qualified Data.Set as S (union, null, delete) +import Data.Tuple.Extra (second) + +parse :: String -> (Char, Char) +parse str = (str !! 36, str !! 5) + +dependencies :: [(Char, Char)] -> Map Char (Set Char) +dependencies ds = + let dependents = fromListWith S.union . map (second singleton) $ ds + independents = fromList . (flip zip) (repeat empty) . snd . unzip $ ds + in M.union dependents independents + +part1 :: Map Char (Set Char) -> String -> String +part1 deps str + | M.null deps = reverse str + | otherwise = + let available = fst . findMin . M.filter S.null $ deps + in part1 (fmap (S.delete available) (M.delete available deps)) (available:str) + main :: IO () main = do - input <- readFile "input/07.txt" - print input \ No newline at end of file + input <- map parse . lines <$> readFile "input/07.txt" + putStrLn $ part1 (dependencies input) "" \ No newline at end of file