Day 07 - part 1.

This commit is contained in:
Jonathan Chan 2018-12-06 23:17:18 -08:00
parent 4858769427
commit dc664e3b16
4 changed files with 127 additions and 3 deletions

View File

@ -30,4 +30,4 @@ import qualified Day24
import qualified Day25
main :: IO ()
main = Day06.main
main = Day07.main

101
input/07.txt Normal file
View File

@ -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.

View File

@ -23,6 +23,7 @@ dependencies:
- base >= 4.7 && < 5
- containers
- text
- extra
library:
source-dirs: src

View File

@ -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
input <- map parse . lines <$> readFile "input/07.txt"
putStrLn $ part1 (dependencies input) ""