@@ -18,25 +18,10 @@ 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 ]]
21
22
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))({
40
25
case ((reqs, workers, inProgress), None ) =>
41
26
(reqs, workers :+ None , inProgress)
42
27
@@ -48,18 +33,35 @@ object Day7 {
48
33
else
49
34
(reqs, workers :+ Some (Work (step, timeLeft - 1 )), inProgress)
50
35
})
36
+ }
51
37
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
+ }
53
51
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))({
55
54
case ((reqs, workers, inProgress), None ) =>
56
55
pickWork(reqs, workers, inProgress)
57
56
58
57
case ((reqs, workers, inProgress), s@ Some (Work (step, timeLeft))) =>
59
58
(reqs, workers :+ s, inProgress)
60
59
})
60
+ }
61
61
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)
63
65
64
66
if (reqs3.isEmpty && inProgress3.isEmpty)
65
67
return 0
0 commit comments