this repo has no description
at master 4.9 kB view raw
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```