-
Notifications
You must be signed in to change notification settings - Fork 0
/
day7_part2.jakt
91 lines (76 loc) · 2.65 KB
/
day7_part2.jakt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/// Expect:
/// - output: "1024\n"
import reader
import utility
function sort_can_visit(can_visit: [String]) {
utility::sort(values: can_visit, sorter: &function(anon item_a: &String, anon item_b: &String) -> i8 {
if item_a > item_b {
return -1
} else if item_a < item_b {
return 1
} else {
return 0
}
});
}
function remove_visited(mut dependancies: [String:[String]], visit: String) throws {
for key in dependancies.keys().iterator() {
if dependancies[key].contains(visit) {
dependancies[key] = utility::array_remove(arr: dependancies[key], remove_str: visit)
}
}
}
function main() {
mut dependancies: [String:[String]] = [:]
for step_dependancy_str in reader::lines_string(day: 7).iterator() {
let step_dependancy_parts = step_dependancy_str.split(' ')
if not dependancies.contains(step_dependancy_parts[1]) {
dependancies[step_dependancy_parts[1]] = []
}
if not dependancies.contains(step_dependancy_parts[7]) {
dependancies[step_dependancy_parts[7]] = []
}
dependancies[step_dependancy_parts[7]].push(step_dependancy_parts[1])
}
mut visited: [String] = []
mut can_visit: [String] = []
mut in_process: [String] = []
mut workers: [(String, i32)] = [
("", 0i32)
("", 0i32)
("", 0i32)
("", 0i32)
("", 0i32)
]
mut second = 0i32
loop {
for (i, status) in utility::enumerate(iterator: workers.iterator()) {
if status.0.length() != 0 && second == status.1 {
remove_visited(dependancies, visit: status.0)
visited.push(status.0)
in_process = utility::array_remove(arr: in_process, remove_str: status.0)
workers[i].0 = ""
workers[i].1 = 0
}
}
for key in dependancies.keys().iterator() {
if dependancies[key].size() == 0 and not can_visit.contains(key) and not visited.contains(key) and not in_process.contains(key) {
can_visit.push(key)
}
}
if can_visit.size() == 0 and in_process.size() == 0 {
break
}
sort_can_visit(can_visit)
for (i, status) in utility::enumerate(workers.iterator()) {
if status.0.length() == 0 and can_visit.size() > 0 {
let visit = can_visit.pop()!
in_process.push(visit)
workers[i].0 = visit
workers[i].1 = second + visit.byte_at(0) as! i32 - 4
}
}
second++
}
println("{}", second)
}