···
1
+
<!-- livebook:{"persist_outputs":true} -->
7
+
{:kino_aoc, git: "https://github.com/ljgago/kino_aoc"}
11
+
<!-- livebook:{"output":true} -->
19
+
<!-- livebook:{"attrs":{"day":"10","session_secret":"ADVENT_OF_CODE_SESSION","variable":"puzzle_input","year":"2022"},"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
22
+
{:ok, puzzle_input} =
23
+
KinoAOC.download_puzzle("2022", "10", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
26
+
<!-- livebook:{"output":true} -->
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"}
36
+
|> String.split("\n", trim: true)
38
+
"noop" -> %{cycles: 1, inc: 0}
39
+
"addx " <> num -> %{cycles: 2, inc: String.to_integer(num)}
43
+
<!-- livebook:{"output":true} -->
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},
103
+
def eval(bc, acc, func) do
108
+
inst, {{signal, cycles}, acc} ->
109
+
cycles = cycles + inst.cycles
111
+
{{signal + inst.inc, cycles}, func.({cycles, signal}, acc)}
118
+
<!-- livebook:{"output":true} -->
121
+
{:module, CRT, <<70, 79, 82, 49, 0, 0, 9, ...>>, {:eval, 3}}
130
+
{Enum.to_list(20..220//40), 0},
132
+
{cycles, x}, {[bp | bps], sum} ->
134
+
{bps, sum + x * bp}
147
+
<!-- livebook:{"output":true} -->
160
+
fn {cycle, x}, {p, screen} ->
161
+
range = (x - 1)..(x + 1)
165
+
|> Enum.reduce(screen, fn px, acc ->
166
+
line = div(px, 40) * 40
167
+
[(px - line) in range | acc]
175
+
|> Enum.reduce([], fn
176
+
false, acc -> [?\s | acc]
177
+
true, acc -> [?█ | acc]
179
+
|> Enum.chunk_every(40)
184
+
<!-- livebook:{"output":true} -->
187
+
███ ██ ████ ████ █ █ █ █ ███ █ █
188
+
█ █ █ █ █ █ █ █ █ █ █ █ █ █
189
+
█ █ █ █ ███ ████ █ █ █ █ ██
190
+
███ █ ██ █ █ █ █ █ █ ███ █ █
191
+
█ █ █ █ █ █ █ █ █ █ █ █ █ █
192
+
█ █ ███ ████ ████ █ █ ██ █ █ █ █
195
+
<!-- livebook:{"output":true} -->