this repo has no description

ft: add day 10.2022

+199
+199
2022/day10.livemd
··· 1 + <!-- livebook:{"persist_outputs":true} --> 2 + 3 + # Day 10 4 + 5 + ```elixir 6 + Mix.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"},"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 34 + bytecode = 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 102 + defmodule 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 115 + end 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 + 144 + sum 145 + ``` 146 + 147 + <!-- livebook:{"output":true} --> 148 + 149 + ``` 150 + 5360 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 + 174 + screen 175 + |> Enum.reduce([], fn 176 + false, acc -> [?\s | acc] 177 + true, acc -> [?█ | acc] 178 + end) 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 + ```