From 3be1e8fae315f8455beb871b53a4575c15b4e4ec Mon Sep 17 00:00:00 2001 From: Jesse McDonald Date: Fri, 7 Dec 2018 21:58:39 -0600 Subject: [PATCH] Day 7, parts 1 & 2: Initial solutions. --- Day7/Part1.hs | 25 ++++++++++++ Day7/Part2.hs | 33 ++++++++++++++++ Day7/input.txt | 101 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 159 insertions(+) create mode 100755 Day7/Part1.hs create mode 100755 Day7/Part2.hs create mode 100644 Day7/input.txt diff --git a/Day7/Part1.hs b/Day7/Part1.hs new file mode 100755 index 0000000..9a13066 --- /dev/null +++ b/Day7/Part1.hs @@ -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) + diff --git a/Day7/Part2.hs b/Day7/Part2.hs new file mode 100755 index 0000000..2d6e85e --- /dev/null +++ b/Day7/Part2.hs @@ -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)] diff --git a/Day7/input.txt b/Day7/input.txt new file mode 100644 index 0000000..b974081 --- /dev/null +++ b/Day7/input.txt @@ -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.