-
Notifications
You must be signed in to change notification settings - Fork 0
/
day12_part1.jakt
111 lines (91 loc) · 2.81 KB
/
day12_part1.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/// Expect:
/// - output: "1733\n"
import reader
import utility
struct Rule {
pattern: [bool]
result: bool
}
function main() {
mut rules: [Rule] = []
mut current_state: [bool] = []
mut start_offset = 0uz
for (i, line) in utility::enumerate(reader::lines_string(day: 12).iterator()) {
if i == 0 {
let state_string = line.replace(replace: "initial state: ", with: "")
current_state = [false;state_string.length()*3]
start_offset = state_string.length()
mut offset = start_offset
for char_ in utility::string_to_char_array(state_string) {
current_state[offset] = match char_ {
b'#' => true
else => false
}
offset++
}
} else {
let line_parts = line.split(' ')
mut current_pattern: [bool] = []
for char_ in utility::string_to_char_array(line_parts[0]) {
current_pattern.push(match char_ {
b'#' => true
else => false
})
}
rules.push(Rule(
pattern: current_pattern
result: match line_parts[2].byte_at(0) {
b'#' => true
else => false
}
))
}
}
for i in 0..20 {
current_state = apply_rules(current_state, rules)
}
println("{}", score_state(current_state, start_offset))
}
function apply_rules(current_state: [bool], rules: [Rule]) throws -> [bool] {
mut new_state: [bool] = [false;current_state.size()]
for i in 0..current_state.size() {
for rule in rules {
if i + rule.pattern.size() > current_state.size() {
continue
}
mut found = true
for j in i..(i + rule.pattern.size()) {
if current_state[j] != rule.pattern[j-i] {
found = false
break
}
}
if found {
let mid_point = i + (rule.pattern.size() / 2)
new_state[mid_point] = rule.result
}
}
}
return new_state
}
function score_state(current_state: [bool], start_offset: usize) -> i64 {
print_state(current_state, start_offset)
mut total = 0
for i in 0..current_state.size() {
if current_state[i] {
total += (i as !i64 - start_offset as! i64 )
}
}
return total
}
function print_state(current_state: [bool], start_offset: usize) {
for i in 0..current_state.size() {
print("({}|" (i as !i64 - start_offset as !i64))
if current_state[i] {
print("#)")
} else {
print(".)")
}
}
println("")
}