8000 Simplify 2018 day 7 part 2 by forgetting worker order · sim642/adventofcode@cff276d · GitHub
[go: up one dir, main page]

Skip to content

Commit cff276d

Browse files
committed
Simplify 2018 day 7 part 2 by forgetting worker order
1 parent 7db23ca commit cff276d

File tree

1 file changed

+19
-26
lines changed
  • src/main/scala/eu/sim642/adventofcode2018

1 file changed

+19
-26
lines changed

src/main/scala/eu/sim642/adventofcode2018/Day7.scala

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,58 +18,51 @@ object Day7 {
1818
def parallelTopologicalSort(reqs: Requirements, workerCount: Int = 5, baseStepTime: Int = 60): Int = {
1919

2020
case class Work(step: Step, timeLeft: Int)
21-
type Workers = Seq[Option[Work]]
2221

23-
def tickTime(reqs: Requirements, workers: Workers, inProgress: Set[Step]) = {
24-
workers.foldLeft((reqs, Seq.empty[Option[Work]], inProgress))({
25-
case ((reqs, workers, inProgress), None) =>
26-
(reqs, workers :+ None, inProgress)
27-
28-
case ((reqs, workers, inProgress), Some(Work(step, timeLeft))) =>
22+
def tickTime(reqs: Requirements, works: Set[Work]) = {
23+
works.foldLeft((reqs, Set.empty[Work]))({
24+
case ((reqs, works), Work(step, timeLeft)) =>
2925
if (timeLeft == 0) {
3026
val restReqs = reqs.filterKeys(_ != step)
31-
(restReqs, workers :+ None, inProgress - step)
27+
(restReqs, works)
3228
}
3329
else
34-
(reqs, workers :+ Some(Work(step, timeLeft - 1)), inProgress)
30+
(reqs, works + Work(step, timeLeft - 1))
3531
})
3632
}
3733

38-
def pickWork(reqs: Requirements, workers: Workers, inProgress: Set[Step]) = {
34+
def pickWork(reqs: Requirements, works: Set[Work]) = {
3935
reqs.values.reduceOption(_ ++ _) match {
40-
case None => (reqs, workers :+ None, inProgress)
36+
case None => None
4137
case Some(haveReqStep) =>
38+
val inProgress = works.map(_.step)
4239
val possibleSteps = reqs.keySet -- haveReqStep -- inProgress
4340
if (possibleSteps.nonEmpty) {
4441
val step = possibleSteps.min
45-
(reqs, workers :+ Some(Work(step, baseStepTime + (step.toInt - 'A'.toInt + 1) - 1)), inProgress + step)
42+
Some(Work(step, baseStepTime + (step.toInt - 'A'.toInt + 1) - 1))
4643
}
4744
else
48-
(reqs, workers :+ None, inProgress)
45+
None
4946
}
5047
}
5148

52-
def pickWorks(reqs: Requirements, workers: Workers, inProgress: Set[Step]) = {
53-
workers.foldLeft((reqs, Seq.empty[Option[Work]], inProgress))({
54-
case ((reqs, workers, inProgress), None) =>
55-
pickWork(reqs, workers, inProgress)
56-
57-
case ((reqs, workers, inProgress), s@Some(Work(step, timeLeft))) =>
58-
(reqs, workers :+ s, inProgress)
49+
def pickWorks(reqs: Requirements, works: Set[Work]) = {
50+
(works.size until workerCount).foldLeft(works)({
51+
case (works, _) => works ++ pickWork(reqs, works).toSet
5952
})
6053
}
6154

62-
def helper(reqs: Requirements, workers: Workers, inProgress: Set[Step]): Int = {
63-
val (reqs2, workers2, inProgress2) = tickTime(reqs, workers, inProgress)
64-
val (reqs3, workers3, inProgress3) = pickWorks(reqs2, workers2, inProgress2)
55+
def helper(reqs: Requirements, works: Set[Work]): Int = {
56+
val (reqs2, works2) = tickTime(reqs, works)
57+
val works3 = pickWorks(reqs2, works2)
6558

66-
if (reqs3.isEmpty && inProgress3.isEmpty)
59+
if (reqs2.isEmpty && works3.isEmpty)
6760
return 0
6861

69-
1 + helper(reqs3, workers3, inProgress3)
62+
1 + helper(reqs2, works3)
7063
}
7164

72-
helper(reqs, Seq.fill(workerCount)(None), Set.empty)
65+
helper(reqs, Set.empty)
7366
}
7467

7568

0 commit comments

Comments
 (0)
0