Browse Source

Quick and dirty day 7.

This code was brought to you by insomnia.
master
Chris Smith 5 years ago
parent
commit
7321fcb8e3
2 changed files with 161 additions and 0 deletions
  1. 101
    0
      data/07.txt
  2. 60
    0
      day07.nim

+ 101
- 0
data/07.txt View File

@@ -0,0 +1,101 @@
1
+Step F must be finished before step N can begin.
2
+Step V must be finished before step Y can begin.
3
+Step B must be finished before step W can begin.
4
+Step K must be finished before step O can begin.
5
+Step E must be finished before step H can begin.
6
+Step A must be finished before step P can begin.
7
+Step Y must be finished before step S can begin.
8
+Step T must be finished before step L can begin.
9
+Step G must be finished before step R can begin.
10
+Step I must be finished before step H can begin.
11
+Step X must be finished before step M can begin.
12
+Step N must be finished before step C can begin.
13
+Step O must be finished before step R can begin.
14
+Step Z must be finished before step R can begin.
15
+Step R must be finished before step D can begin.
16
+Step M must be finished before step C can begin.
17
+Step H must be finished before step D can begin.
18
+Step C must be finished before step U can begin.
19
+Step J must be finished before step D can begin.
20
+Step L must be finished before step Q can begin.
21
+Step D must be finished before step U can begin.
22
+Step S must be finished before step U can begin.
23
+Step U must be finished before step Q can begin.
24
+Step P must be finished before step Q can begin.
25
+Step W must be finished before step Q can begin.
26
+Step X must be finished before step R can begin.
27
+Step P must be finished before step W can begin.
28
+Step B must be finished before step U can begin.
29
+Step E must be finished before step J can begin.
30
+Step T must be finished before step R can begin.
31
+Step M must be finished before step L can begin.
32
+Step M must be finished before step P can begin.
33
+Step V must be finished before step T can begin.
34
+Step T must be finished before step U can begin.
35
+Step R must be finished before step W can begin.
36
+Step V must be finished before step A can begin.
37
+Step X must be finished before step S can begin.
38
+Step V must be finished before step U can begin.
39
+Step C must be finished before step P can begin.
40
+Step J must be finished before step S can begin.
41
+Step F must be finished before step D can begin.
42
+Step Y must be finished before step U can begin.
43
+Step L must be finished before step W can begin.
44
+Step F must be finished before step T can begin.
45
+Step B must be finished before step E can begin.
46
+Step F must be finished before step J can begin.
47
+Step R must be finished before step M can begin.
48
+Step Z must be finished before step W can begin.
49
+Step K must be finished before step E can begin.
50
+Step S must be finished before step W can begin.
51
+Step U must be finished before step P can begin.
52
+Step S must be finished before step P can begin.
53
+Step D must be finished before step W can begin.
54
+Step Z must be finished before step P can begin.
55
+Step U must be finished before step W can begin.
56
+Step M must be finished before step J can begin.
57
+Step M must be finished before step W can begin.
58
+Step H must be finished before step U can begin.
59
+Step E must be finished before step C can begin.
60
+Step C must be finished before step Q can begin.
61
+Step L must be finished before step U can begin.
62
+Step Y must be finished before step R can begin.
63
+Step E must be finished before step D can begin.
64
+Step A must be finished before step S can begin.
65
+Step Z must be finished before step J can begin.
66
+Step X must be finished before step W can begin.
67
+Step C must be finished before step D can begin.
68
+Step C must be finished before step S can begin.
69
+Step G must be finished before step N can begin.
70
+Step K must be finished before step Z can begin.
71
+Step T must be finished before step I can begin.
72
+Step H must be finished before step W can begin.
73
+Step E must be finished before step Q can begin.
74
+Step R must be finished before step J can begin.
75
+Step O must be finished before step H can begin.
76
+Step O must be finished before step J can begin.
77
+Step L must be finished before step S can begin.
78
+Step A must be finished before step H can begin.
79
+Step K must be finished before step G can begin.
80
+Step I must be finished before step X can begin.
81
+Step T must be finished before step W can begin.
82
+Step O must be finished before step W can begin.
83
+Step N must be finished before step Q can begin.
84
+Step V must be finished before step Z can begin.
85
+Step H must be finished before step S can begin.
86
+Step F must be finished before step L can begin.
87
+Step X must be finished before step Z can begin.
88
+Step I must be finished before step U can begin.
89
+Step T must be finished before step J can begin.
90
+Step G must be finished before step S can begin.
91
+Step E must be finished before step U can begin.
92
+Step M must be finished before step U can begin.
93
+Step J must be finished before step U can begin.
94
+Step E must be finished before step P can begin.
95
+Step F must be finished before step C can begin.
96
+Step O must be finished before step Q can begin.
97
+Step D must be finished before step Q can begin.
98
+Step A must be finished before step L can begin.
99
+Step H must be finished before step J can begin.
100
+Step I must be finished before step P can begin.
101
+Step Y must be finished before step D can begin.

+ 60
- 0
day07.nim View File

@@ -0,0 +1,60 @@
1
+import sequtils, strutils
2
+
3
+var
4
+    dependencies: array[26, array[27, bool]]
5
+
6
+for line in readFile("data/07.txt").strip.splitlines:
7
+    dependencies[ord(line[36]) - 65][ord(line[5]) - 64] = true
8
+
9
+func next_task(status: array[26, array[27, bool]]): int =
10
+    var falses: array[27, bool]
11
+    status.find(falses)
12
+
13
+func execute(status: ptr array[26, array[27, bool]], action: int) =
14
+    status[action][0] = true
15
+    for i in 0..25:
16
+        status[i][action + 1] = false
17
+
18
+func part1(dependencies: array[26, array[27, bool]]): string =
19
+    var status: array[26, array[27, bool]]
20
+    status.deepCopy(dependencies)
21
+    for i in 0..25:
22
+        var task = status.next_task
23
+        status.addr.execute(task)
24
+        result &= chr(task + 65)
25
+
26
+func part2(dependencies: array[26, array[27, bool]]): int =
27
+    var
28
+        status: array[26, array[27, bool]]
29
+        worker_times: array[5, int]
30
+        task_times: array[26, int]
31
+        completed = ""
32
+        time = 0
33
+
34
+    status.deepCopy(dependencies)
35
+
36
+    while len(completed) < 26:
37
+        time += 1
38
+        for i in 0..25:
39
+            if task_times[i] == 1:
40
+                task_times[i] = 0
41
+                completed &= chr(i + 65)
42
+                status.addr.execute(i)
43
+            elif task_times[i] > 1:
44
+                task_times[i] -= 1
45
+
46
+        for i in 0..4:
47
+            if worker_times[i] > 0:
48
+                worker_times[i] -= 1
49
+            
50
+            if worker_times[i] == 0:
51
+                var task = status.next_task
52
+                if task > -1:
53
+                    worker_times[i] = 61 + task
54
+                    task_times[task] = 61 + task
55
+                    status[task][0] = true
56
+
57
+    time - 1
58
+
59
+echo dependencies.part1
60
+echo dependencies.part2