-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday9.um
123 lines (104 loc) · 2.26 KB
/
day9.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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
fn expand1(line: str): []int {
res := []int{}
sec := true
id := 0
for i, c in line {
if sec {
for i := 0; i < int(c)-int('0'); i++ {
res = append(res, id)
}
id++
sec = false
} else {
for i := 0; i < int(c)-int('0'); i++ {
res = append(res, -1)
}
sec = true
}
}
return res
}
type P = struct {
used: bool
l: int
id: int
}
fn expand2(line: str): []P {
res := []P{}
sec := true
id := 0
for i, c in line {
if sec {
res = append(res, P{true, int(c)-int('0'), id})
id++
sec = false
} else {
res = append(res, P{false, int(c)-int('0'), 0})
sec = true
}
}
return res
}
fn findused(ex: []P, ii: int, l: int): int {
for i := len(ex)-1; i > ii; i-- {
if ex[i].used && ex[i].l <= l {
return i
}
}
return -1
}
fn main() {
line := ""
scanf("%s", &line)
expanded := expand1(line)
i, j := 0, len(expanded)-1
for true {
for expanded[j] == -1 {
j--
}
for expanded[i] != -1 {
i++
}
if i >= j {
break
}
expanded[i] = expanded[j]
expanded[j] = -1
}
res := 0
for i, v in expanded {
if v == -1 {
break
}
res += i*v
}
printf("Part 1: %v\n", res)
expanded2 := expand2(line)
for i := 0; i < len(expanded2); i++ {
v := expanded2[i]
if !v.used {
best := findused(expanded2, i, v.l)
if best != -1 {
diff := v.l-expanded2[best].l
expanded2[i] = expanded2[best]
expanded2[best].used = false
if expanded2[best].l < v.l {
expanded2 = insert(expanded2, i+1, P{l: diff, used: false})
}
}
}
}
p := 0
res2 := 0
for i, v in expanded2 {
if v.used {
for i := 0; i < v.l; i++ {
res2 += p*v.id
p++
}
} else {
p += v.l
}
}
printf("Part 2: %v\n", res2)
}