-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday2.um
103 lines (87 loc) · 2 KB
/
day2.um
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
import "std.um"
fn splitBy*(text: str, by: char): []str {
items := []str{}
last := 0
for i, c in text {
if c == by {
items = append(items, slice(text, last, i))
last = i+1 // Skip the character by adding one.
}
}
items = append(items, slice(text, last))
return items
}
fn variations(level: []int): [][]int {
variations := [][]int{}
for i := 0; i < len(level); i++ {
variations = append(variations, delete(copy(level), i))
}
return variations
}
fn isvalid(level: []int): bool {
last := -1
dir := 0
for i, v in level {
if last == -1 {
last = v
} else {
if abs(v - last) > 3 {
return false
}
newdir := 0
if v > last {
newdir = 1
} else if v < last {
newdir = -1
} else if v == last {
return false
}
if dir == 0 {
dir = newdir
} else if newdir != dir {
return false
}
last = v
}
}
return true
}
fn main() {
lines := []str{}
s := ""
for c := std::getchar(); c != '\0'; c = std::getchar() {
if c == '\n' {
lines = append(lines, s)
s = ""
} else {
s += c
}
}
lines = append(lines, s)
levels := [][]int{}
for i, line in lines {
level := []int{}
strs := splitBy(line, ' ')
for i, n in strs {
level = append(level, std::atoi(n))
}
levels = append(levels, level)
}
safe1, safe2 := 0, 0
for _, l in levels {
if isvalid(l) {
safe1++
safe2++
} else {
vs := variations(l)
for i, v in vs {
if isvalid(v) {
safe2++
break
}
}
}
}
printf("Part 1: %v\n", safe1)
printf("Part 2: %v\n", safe2)
}