Day 7, parts 1 & 2: Initial solutions.

This commit is contained in:
Jesse D. McDonald 2018-12-07 21:58:39 -06:00
parent 0328b3c9c0
commit 3be1e8fae3
3 changed files with 159 additions and 0 deletions

25
Day7/Part1.hs Executable file
View File

@ -0,0 +1,25 @@
#! /usr/bin/env stack
-- stack --resolver lts-12.20 --install-ghc script
{-# LANGUAGE ViewPatterns #-}
module Main where
import Data.Function (fix)
import qualified Data.List as L
import qualified Data.Set as S
import qualified Data.Map as M
main :: IO ()
main = interact $ (. (M.unionsWith (<>) . map parseLine . lines)) $ fix $ \repeat depSets ->
if M.null depSets then "" else let
(noDep, _) = M.findMin $ M.filter S.null depSets
depSets' = M.map (S.delete noDep) (M.delete noDep depSets)
in noDep : repeat depSets'
parseLine :: String -> M.Map Char (S.Set Char)
parseLine (words -> ws) =
M.unionWith (<>) (M.singleton req S.empty)
(M.singleton step (S.singleton req))
where
req = (head $ ws !! 1)
step = (head $ ws !! 7)

33
Day7/Part2.hs Executable file
View File

@ -0,0 +1,33 @@
#! /usr/bin/env stack
-- stack --resolver lts-12.20 --install-ghc script
{-# LANGUAGE ViewPatterns #-}
module Main where
import Control.Arrow ((&&&))
import qualified Data.List as L
import qualified Data.Set as S
import qualified Data.Map as M
import Debug.Trace
main :: IO ()
main = interact $ show . simulate (-1) [] . parseInput
simulate :: Int -> [(Char, Int)] -> M.Map Char (S.Set Char) -> Int
simulate t ws depSets = traceShow (t, ws) $
if null ws && M.null depSets then t
else simulate (t+1) ws'' depSets''
where
(ws', S.fromList . fmap fst -> finished) =
L.partition ((> 0) . snd) $ fmap (fmap (subtract 1)) ws
depSets' = M.map (`S.difference` finished) depSets
starting = take (5 - length ws') . L.sort . M.keys . M.filter S.null $ depSets'
stepTime c = 60 + (fromEnum c - fromEnum 'A' + 1)
ws'' = ws' ++ fmap (id &&& stepTime) starting
depSets'' = flip (foldr M.delete) starting depSets'
parseInput :: String -> M.Map Char (S.Set Char)
parseInput = M.unionsWith (<>) . fmap parseLine . lines
where
parseLine (words -> (_:(req:_):_:_:_:_:_:(step:_):_)) =
M.fromList [(req, S.empty), (step, S.singleton req)]

101
Day7/input.txt Normal file
View File

@ -0,0 +1,101 @@
Step L must be finished before step T can begin.
Step B must be finished before step I can begin.
Step A must be finished before step T can begin.
Step F must be finished before step T can begin.
Step D must be finished before step J can begin.
Step N must be finished before step R can begin.
Step J must be finished before step U can begin.
Step C must be finished before step Z can begin.
Step V must be finished before step H can begin.
Step W must be finished before step H can begin.
Step H must be finished before step I can begin.
Step R must be finished before step K can begin.
Step M must be finished before step X can begin.
Step T must be finished before step O can begin.
Step Q must be finished before step P can begin.
Step I must be finished before step E can begin.
Step E must be finished before step Y can begin.
Step K must be finished before step Y can begin.
Step X must be finished before step O can begin.
Step U must be finished before step G can begin.
Step Z must be finished before step P can begin.
Step O must be finished before step S can begin.
Step S must be finished before step G can begin.
Step Y must be finished before step G can begin.
Step P must be finished before step G can begin.
Step C must be finished before step P can begin.
Step N must be finished before step K can begin.
Step E must be finished before step U can begin.
Step C must be finished before step T can begin.
Step F must be finished before step I can begin.
Step Q must be finished before step Y can begin.
Step E must be finished before step S can begin.
Step T must be finished before step P can begin.
Step K must be finished before step O can begin.
Step H must be finished before step Y can begin.
Step Q must be finished before step G can begin.
Step K must be finished before step P can begin.
Step R must be finished before step O can begin.
Step W must be finished before step T can begin.
Step O must be finished before step P can begin.
Step Q must be finished before step X can begin.
Step D must be finished before step I can begin.
Step R must be finished before step T can begin.
Step I must be finished before step K can begin.
Step I must be finished before step G can begin.
Step K must be finished before step G can begin.
Step N must be finished before step U can begin.
Step A must be finished before step Y can begin.
Step X must be finished before step Y can begin.
Step N must be finished before step H can begin.
Step R must be finished before step Z can begin.
Step C must be finished before step Q can begin.
Step F must be finished before step O can begin.
Step B must be finished before step Z can begin.
Step Z must be finished before step S can begin.
Step U must be finished before step S can begin.
Step A must be finished before step K can begin.
Step B must be finished before step N can begin.
Step T must be finished before step E can begin.
Step A must be finished before step N can begin.
Step F must be finished before step V can begin.
Step D must be finished before step C can begin.
Step M must be finished before step P can begin.
Step D must be finished before step V can begin.
Step V must be finished before step Q can begin.
Step O must be finished before step Y can begin.
Step W must be finished before step I can begin.
Step E must be finished before step Z can begin.
Step B must be finished before step R can begin.
Step C must be finished before step X can begin.
Step J must be finished before step T can begin.
Step A must be finished before step W can begin.
Step Q must be finished before step U can begin.
Step I must be finished before step Z can begin.
Step N must be finished before step P can begin.
Step W must be finished before step U can begin.
Step Y must be finished before step P can begin.
Step J must be finished before step P can begin.
Step F must be finished before step Q can begin.
Step L must be finished before step M can begin.
Step E must be finished before step G can begin.
Step B must be finished before step P can begin.
Step H must be finished before step X can begin.
Step W must be finished before step S can begin.
Step N must be finished before step Q can begin.
Step J must be finished before step I can begin.
Step L must be finished before step F can begin.
Step S must be finished before step Y can begin.
Step J must be finished before step X can begin.
Step A must be finished before step H can begin.
Step T must be finished before step U can begin.
Step H must be finished before step Z can begin.
Step W must be finished before step R can begin.
Step X must be finished before step Z can begin.
Step T must be finished before step Y can begin.
Step H must be finished before step T can begin.
Step K must be finished before step U can begin.
Step H must be finished before step G can begin.
Step U must be finished before step O can begin.
Step W must be finished before step P can begin.
Step A must be finished before step D can begin.