@@ -18,58 +18,51 @@ object Day7 {
18
18
def parallelTopologicalSort (reqs : Requirements , workerCount : Int = 5 , baseStepTime : Int = 60 ): Int = {
19
19
20
20
case class Work (step : Step , timeLeft : Int )
21
- type Workers = Seq [Option [Work ]]
22
21
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)) =>
29
25
if (timeLeft == 0 ) {
30
26
val restReqs = reqs.filterKeys(_ != step)
31
- (restReqs, workers :+ None , inProgress - step )
27
+ (restReqs, works )
32
28
}
33
29
else
34
- (reqs, workers :+ Some ( Work (step, timeLeft - 1 )), inProgress )
30
+ (reqs, works + Work (step, timeLeft - 1 ))
35
31
})
36
32
}
37
33
38
- def pickWork (reqs : Requirements , workers : Workers , inProgress : Set [Step ]) = {
34
+ def pickWork (reqs : Requirements , works : Set [Work ]) = {
39
35
reqs.values.reduceOption(_ ++ _) match {
40
- case None => (reqs, workers :+ None , inProgress)
36
+ case None => None
41
37
case Some (haveReqStep) =>
38
+ val inProgress = works.map(_.step)
42
39
val possibleSteps = reqs.keySet -- haveReqStep -- inProgress
43
40
if (possibleSteps.nonEmpty) {
44
41
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 ))
46
43
}
47
44
else
48
- (reqs, workers :+ None , inProgress)
45
+ None
49
46
}
50
47
}
51
48
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
59
52
})
60
53
}
61
54
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 )
65
58
66
- if (reqs3 .isEmpty && inProgress3 .isEmpty)
59
+ if (reqs2 .isEmpty && works3 .isEmpty)
67
60
return 0
68
61
69
- 1 + helper(reqs3, workers3, inProgress3 )
62
+ 1 + helper(reqs2, works3 )
70
63
}
71
64
72
- helper(reqs, Seq .fill(workerCount)( None ), Set .empty)
65
+ helper(reqs, Set .empty)
73
66
}
74
67
75
68
0 commit comments