tangled
alpha
login
or
join now
hauleth.dev
/
advent-of-code
3
fork
atom
this repo has no description
3
fork
atom
overview
issues
pulls
pipelines
ft: add day 10.2022
hauleth.dev
3 years ago
45c981ce
e6de0b33
+199
1 changed file
expand all
collapse all
unified
split
2022
day10.livemd
+199
2022/day10.livemd
···
1
1
+
<!-- livebook:{"persist_outputs":true} -->
2
2
+
3
3
+
# Day 10
4
4
+
5
5
+
```elixir
6
6
+
Mix.install([
7
7
+
{:kino_aoc, git: "https://github.com/ljgago/kino_aoc"}
8
8
+
])
9
9
+
```
10
10
+
11
11
+
<!-- livebook:{"output":true} -->
12
12
+
13
13
+
```
14
14
+
:ok
15
15
+
```
16
16
+
17
17
+
## Section
18
18
+
19
19
+
<!-- livebook:{"attrs":{"day":"10","session_secret":"ADVENT_OF_CODE_SESSION","variable":"puzzle_input","year":"2022"},"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
20
20
+
21
21
+
```elixir
22
22
+
{:ok, puzzle_input} =
23
23
+
KinoAOC.download_puzzle("2022", "10", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
24
24
+
```
25
25
+
26
26
+
<!-- livebook:{"output":true} -->
27
27
+
28
28
+
```
29
29
+
{:ok,
30
30
+
"noop\naddx 7\naddx -1\naddx -1\naddx 5\nnoop\nnoop\naddx 1\naddx 3\naddx 2\nnoop\naddx 2\naddx 5\naddx 2\naddx 10\naddx -9\naddx 4\nnoop\nnoop\nnoop\naddx 3\naddx 5\naddx -40\naddx 26\naddx -23\naddx 2\naddx 5\naddx 26\naddx -35\naddx 12\naddx 2\naddx 17\naddx -10\naddx 3\nnoop\naddx 2\naddx 3\nnoop\naddx 2\naddx 3\nnoop\naddx 2\naddx 2\naddx -39\nnoop\naddx 15\naddx -12\naddx 2\naddx 10\nnoop\naddx -1\naddx -2\nnoop\naddx 5\nnoop\naddx 5\nnoop\nnoop\naddx 1\naddx 4\naddx -25\naddx 26\naddx 2\naddx 5\naddx 2\nnoop\naddx -3\naddx -32\naddx 1\naddx 4\naddx -2\naddx 3\nnoop\nnoop\naddx 3\nnoop\naddx 6\naddx -17\naddx 27\naddx -7\naddx 5\naddx 2\naddx 3\naddx -2\naddx 4\nnoop\nnoop\naddx 5\naddx 2\naddx -39\nnoop\nnoop\naddx 2\naddx 5\naddx 3\naddx -2\naddx 2\naddx 11\naddx -4\naddx -5\nnoop\naddx 10\naddx -18\naddx 19\naddx 2\naddx 5\naddx 2\naddx 2\naddx 3\naddx -2\naddx 2\naddx -37\nnoop\naddx 5\naddx 4\naddx -1\nnoop\naddx 4\nnoop\nnoop\naddx 1\naddx 4\nnoop\naddx 1\naddx 2\nnoop\naddx 3\naddx 5\nnoop\naddx -3\naddx 5\naddx 5\naddx 2\naddx 3\nnoop\naddx -32\nnoop\n"}
31
31
+
```
32
32
+
33
33
+
```elixir
34
34
+
bytecode =
35
35
+
puzzle_input
36
36
+
|> String.split("\n", trim: true)
37
37
+
|> Enum.map(fn
38
38
+
"noop" -> %{cycles: 1, inc: 0}
39
39
+
"addx " <> num -> %{cycles: 2, inc: String.to_integer(num)}
40
40
+
end)
41
41
+
```
42
42
+
43
43
+
<!-- livebook:{"output":true} -->
44
44
+
45
45
+
```
46
46
+
[
47
47
+
%{cycles: 1, inc: 0},
48
48
+
%{cycles: 2, inc: 7},
49
49
+
%{cycles: 2, inc: -1},
50
50
+
%{cycles: 2, inc: -1},
51
51
+
%{cycles: 2, inc: 5},
52
52
+
%{cycles: 1, inc: 0},
53
53
+
%{cycles: 1, inc: 0},
54
54
+
%{cycles: 2, inc: 1},
55
55
+
%{cycles: 2, inc: 3},
56
56
+
%{cycles: 2, inc: 2},
57
57
+
%{cycles: 1, inc: 0},
58
58
+
%{cycles: 2, inc: 2},
59
59
+
%{cycles: 2, inc: 5},
60
60
+
%{cycles: 2, inc: 2},
61
61
+
%{cycles: 2, inc: 10},
62
62
+
%{cycles: 2, inc: -9},
63
63
+
%{cycles: 2, inc: 4},
64
64
+
%{cycles: 1, inc: 0},
65
65
+
%{cycles: 1, inc: 0},
66
66
+
%{cycles: 1, inc: 0},
67
67
+
%{cycles: 2, inc: 3},
68
68
+
%{cycles: 2, inc: 5},
69
69
+
%{cycles: 2, inc: -40},
70
70
+
%{cycles: 2, inc: 26},
71
71
+
%{cycles: 2, inc: -23},
72
72
+
%{cycles: 2, inc: 2},
73
73
+
%{cycles: 2, inc: 5},
74
74
+
%{cycles: 2, inc: 26},
75
75
+
%{cycles: 2, inc: -35},
76
76
+
%{cycles: 2, inc: 12},
77
77
+
%{cycles: 2, inc: 2},
78
78
+
%{cycles: 2, inc: 17},
79
79
+
%{cycles: 2, inc: -10},
80
80
+
%{cycles: 2, inc: 3},
81
81
+
%{cycles: 1, inc: 0},
82
82
+
%{cycles: 2, inc: 2},
83
83
+
%{cycles: 2, inc: 3},
84
84
+
%{cycles: 1, inc: 0},
85
85
+
%{cycles: 2, inc: 2},
86
86
+
%{cycles: 2, inc: 3},
87
87
+
%{cycles: 1, inc: 0},
88
88
+
%{cycles: 2, inc: 2},
89
89
+
%{cycles: 2, inc: 2},
90
90
+
%{cycles: 2, inc: -39},
91
91
+
%{cycles: 1, inc: 0},
92
92
+
%{cycles: 2, inc: 15},
93
93
+
%{cycles: 2, inc: -12},
94
94
+
%{cycles: 2, inc: 2},
95
95
+
%{cycles: 2, ...},
96
96
+
%{...},
97
97
+
...
98
98
+
]
99
99
+
```
100
100
+
101
101
+
```elixir
102
102
+
defmodule CRT do
103
103
+
def eval(bc, acc, func) do
104
104
+
Enum.reduce(
105
105
+
bc,
106
106
+
{{1, 0}, acc},
107
107
+
fn
108
108
+
inst, {{signal, cycles}, acc} ->
109
109
+
cycles = cycles + inst.cycles
110
110
+
111
111
+
{{signal + inst.inc, cycles}, func.({cycles, signal}, acc)}
112
112
+
end
113
113
+
)
114
114
+
end
115
115
+
end
116
116
+
```
117
117
+
118
118
+
<!-- livebook:{"output":true} -->
119
119
+
120
120
+
```
121
121
+
{:module, CRT, <<70, 79, 82, 49, 0, 0, 9, ...>>, {:eval, 3}}
122
122
+
```
123
123
+
124
124
+
## Task 1
125
125
+
126
126
+
```elixir
127
127
+
{_, {_, sum}} =
128
128
+
CRT.eval(
129
129
+
bytecode,
130
130
+
{Enum.to_list(20..220//40), 0},
131
131
+
fn
132
132
+
{cycles, x}, {[bp | bps], sum} ->
133
133
+
if bp >= cycles do
134
134
+
{bps, sum + x * bp}
135
135
+
else
136
136
+
{[bp | bps], sum}
137
137
+
end
138
138
+
139
139
+
_, acc ->
140
140
+
acc
141
141
+
end
142
142
+
)
143
143
+
144
144
+
sum
145
145
+
```
146
146
+
147
147
+
<!-- livebook:{"output":true} -->
148
148
+
149
149
+
```
150
150
+
5360
151
151
+
```
152
152
+
153
153
+
## Task 2
154
154
+
155
155
+
```elixir
156
156
+
{_, {_, screen}} =
157
157
+
CRT.eval(
158
158
+
bytecode,
159
159
+
{0, []},
160
160
+
fn {cycle, x}, {p, screen} ->
161
161
+
range = (x - 1)..(x + 1)
162
162
+
163
163
+
screen =
164
164
+
p..(cycle - 1)
165
165
+
|> Enum.reduce(screen, fn px, acc ->
166
166
+
line = div(px, 40) * 40
167
167
+
[(px - line) in range | acc]
168
168
+
end)
169
169
+
170
170
+
{cycle, screen}
171
171
+
end
172
172
+
)
173
173
+
174
174
+
screen
175
175
+
|> Enum.reduce([], fn
176
176
+
false, acc -> [?\s | acc]
177
177
+
true, acc -> [?█ | acc]
178
178
+
end)
179
179
+
|> Enum.chunk_every(40)
180
180
+
|> Enum.join("\n")
181
181
+
|> IO.puts()
182
182
+
```
183
183
+
184
184
+
<!-- livebook:{"output":true} -->
185
185
+
186
186
+
```
187
187
+
███ ██ ████ ████ █ █ █ █ ███ █ █
188
188
+
█ █ █ █ █ █ █ █ █ █ █ █ █ █
189
189
+
█ █ █ █ ███ ████ █ █ █ █ ██
190
190
+
███ █ ██ █ █ █ █ █ █ ███ █ █
191
191
+
█ █ █ █ █ █ █ █ █ █ █ █ █ █
192
192
+
█ █ ███ ████ ████ █ █ ██ █ █ █ █
193
193
+
```
194
194
+
195
195
+
<!-- livebook:{"output":true} -->
196
196
+
197
197
+
```
198
198
+
:ok
199
199
+
```