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