Day 7, parts 1 & 2: Initial solutions.
This commit is contained in:
parent
0328b3c9c0
commit
3be1e8fae3
|
|
@ -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)
|
||||
|
||||
|
|
@ -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)]
|
||||
|
|
@ -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.
|
||||
Loading…
Reference in New Issue