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