8000 Extract 2018 day 7 part 2 simulation logic stages · sim642/adventofcode@7db23ca · GitHub
[go: up one dir, main page]

Skip to content

Commit 7db23ca

Browse files
committed
Extract 2018 day 7 part 2 simulation logic stages
1 parent 7bc8b20 commit 7db23ca

File tree

1 file changed

+23
-21
lines changed
  • src/main/scala/eu/sim642/adventofcode2018

1 file changed

+23
-21
lines changed

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

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,10 @@ 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]]
2122

22-
def helper(reqs: Requirements, workers: Seq[Option[Work]], inProgress: Set[Step]): Int = {
23-
def pickWork(reqs: Requirements, workers: Seq[Option[Work]], inProgress: Set[Step]) = {
24-
reqs.values.reduceOption(_ ++ _) match {
25-
case None => (reqs, workers :+ None, inProgress)
26-
case Some(haveReqStep) =>
27-
val possibleSteps = reqs.keySet -- haveReqStep -- inProgress
28-
if (possibleSteps.nonEmpty) {
29-
val step = possibleSteps.min
30-
(reqs, workers :+ Some(Work(step, baseStepTime + (step.toInt - 'A'.toInt + 1) - 1)), inProgress + step)
31-
}
32-
else
33-
(reqs, workers :+ None, inProgress)
34-
}
35-
}
36-
37-
println(s"1: $workers $inProgress")
38-
39-
val (reqs2, workers2, inProgress2) = workers.foldLeft((reqs, Seq.empty[Option[Work]], inProgress))({
23+
def tickTime(reqs: Requirements, workers: Workers, inProgress: Set[Step]) = {
24+
workers.foldLeft((reqs, Seq.empty[Option[Work]], inProgress))({
4025
case ((reqs, workers, inProgress), None) =>
4126
(reqs, workers :+ None, inProgress)
4227

@@ -48,18 +33,35 @@ object Day7 {
4833
else
4934
(reqs, workers :+ Some(Work(step, timeLeft - 1)), inProgress)
5035
})
36+
}
5137

52-
println(s"2: $workers2 $inProgress2")
38+
def pickWork(reqs: Requirements, workers: Workers, inProgress: Set[Step]) = {
39+
reqs.values.reduceOption(_ ++ _) match {
40+
case None => (reqs, workers :+ None, inProgress)
41+
case Some(haveReqStep) =>
42+
val possibleSteps = reqs.keySet -- haveReqStep -- inProgress
43+
if (possibleSteps.nonEmpty) {
44+
val step = possibleSteps.min
45+
(reqs, workers :+ Some(Work(step, baseStepTime + (step.toInt - 'A'.toInt + 1) - 1)), inProgress + step)
46+
}
47+
else
48+
(reqs, workers :+ None, inProgress)
49+
}
50+
}
5351

54-
val (reqs3, workers3, inProgress3) = workers2.foldLeft((reqs2, Seq.empty[Option[Work]], inProgress2))({
52+
def pickWorks(reqs: Requirements, workers: Workers, inProgress: Set[Step]) = {
53+
workers.foldLeft((reqs, Seq.empty[Option[Work]], inProgress))({
5554
case ((reqs, workers, inProgress), None) =>
5655
pickWork(reqs, workers, inProgress)
5756

5857
case ((reqs, workers, inProgress), s@Some(Work(step, timeLeft))) =>
5958
(reqs, workers :+ s, inProgress)
6059
})
60+
}
6161

62-
println(s"3: $workers3 $inProgress3")
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)
6365

6466
if (reqs3.isEmpty && inProgress3.isEmpty)
6567
return 0

0 commit comments

Comments
 (0)
0