this repo has no description
at master 24 kB view raw
1<!-- vim:ft=markdown --> 2 3<!-- livebook:{"persist_outputs":true} --> 4 5# Day 20 6 7## Section 8 9```elixir 10[algo, board] = 11 File.read!("day20.txt") 12 |> String.split("\n\n") 13 14board = 15 board 16 |> String.split("\n", trim: true) 17 |> Enum.with_index() 18 |> Enum.flat_map(fn {row, y} -> 19 :binary.bin_to_list(row) 20 |> Enum.with_index() 21 |> Enum.map(fn {c, x} -> {{x, y}, if(c == ?#, do: 1, else: 0)} end) 22 end) 23 |> Map.new() 24 25defmodule Day20 do 26 defmodule Image do 27 defstruct [:board, :background] 28 29 @behaviour Access 30 31 def new(board, background \\ 0), 32 do: %__MODULE__{board: board, background: background} 33 34 def dims(%__MODULE__{board: board}) do 35 {{min_x, min_y}, {max_x, max_y}} = board |> Map.keys() |> Enum.min_max() 36 37 {min_x..max_x, min_y..max_y} 38 end 39 40 def lighted(%__MODULE__{background: 1}), do: :inf 41 def lighted(%__MODULE__{board: board}), do: board |> Map.values() |> Enum.sum() 42 43 @impl Access 44 def fetch(%__MODULE__{} = img, {_, _} = key) do 45 case Map.fetch(img.board, key) do 46 {:ok, value} -> {:ok, value} 47 :error -> {:ok, img.background} 48 end 49 end 50 51 def fetch(_data, _key), do: :error 52 53 @impl Access 54 def get_and_update(_data, _key, _func), do: :error 55 56 @impl Access 57 def pop(_data, _key), do: :error 58 59 defimpl Inspect do 60 import Inspect.Algebra 61 62 def inspect(%@for{} = img, _opts) do 63 {min_x..max_x, min_y..max_y} = @for.dims(img) 64 65 display = 66 for y <- (min_y - 1)..(max_y + 1) do 67 row = 68 for x <- (min_x - 1)..(max_x + 1) do 69 if img[{x, y}] == 1, do: "█", else: " " 70 end 71 72 concat([concat(row), line()]) 73 end 74 75 concat([ 76 "#Image<{#{max_x - min_x + 1}x#{max_y - min_y + 1}}", 77 line(), 78 concat(display), 79 ">" 80 ]) 81 end 82 end 83 end 84 85 defmodule Algo do 86 defstruct [:desc] 87 88 @behaviour Access 89 90 def new(desc), do: %__MODULE__{desc: desc} 91 92 @impl Access 93 def fetch(%__MODULE__{desc: desc}, pos) do 94 loc = rem(pos, 512) 95 {:ok, if(binary_part(desc, loc, 1) == "#", do: 1, else: 0)} 96 end 97 98 @impl Access 99 def get_and_update(_data, _key, _func), do: :error 100 101 @impl Access 102 def pop(_data, _key), do: :error 103 end 104 105 def get_bits(img, {x, y}) do 106 digits = 107 for dy <- -1..1, 108 dx <- -1..1, 109 do: img[{x + dx, y + dy}] 110 111 Integer.undigits(digits, 2) 112 end 113 114 def enchance(img, algo) do 115 {min_x..max_x, min_y..max_y} = Image.dims(img) 116 117 board = 118 for y <- (min_y - 1)..(max_y + 1), 119 x <- (min_x - 1)..(max_x + 1), 120 into: %{}, 121 do: {{x, y}, algo[get_bits(img, {x, y})]} 122 123 Image.new(board, algo[512 - img.background]) 124 end 125end 126 127alg = Day20.Algo.new(algo) 128img = Day20.Image.new(board) 129``` 130 131<!-- livebook:{"output":true} --> 132 133``` 134#Image<{100x100} 135 136 █ █ █ ██ ████████ ██ █ █ ███ █ ██ ██ █ ███ █ ██ █ █ █ ██ ███ █ ██ ██ █ ██ █ 137 ███ █ █ █ █ ██ ██ █ ████ ██ █ █ ███ █ █ █ █ ███ █ █ ███ ██ ██████ █ █ █████ 138 ██ █ ███ █ █ ███ ██ ███ █ █ █ █ █ █ ██ ███ ███ ██████ ████ █ █ ██ █ ██ ████ █ ██ 139 █ ██ ████████ ██ █ █ █ █ ██ █ █ █ █ ██ ██ █ █ █ ██ █ █ █ ██████ █ █ █ 140 ███ █ ██ ████ █ █ █ ███ ███ ██ █ █ ███ █ ██ █ ██ ███ █ ██ ██ ██ █ █ ████ █ █ 141 ████ ███ █ ███ █ █ █ █ █████████ ████ █ █ ██ ██ █ █ █ █ █ █ █ █ ███ ██ ██ 142 ███ █ █████ ████ ██ ████ █ █████ ██ ██ ████ ███ ███ ██ █ █ █ ██████ ██ █ ██ █ 143 █ █ █ ███ █ █ █ █ ████ ████ █ █ █ █ █ █ █ ██ █ █ █ █ █████ ██ █ █ ███ 144 ██ ██ ███ █ █ █ █ █ ████ █ ██ ███ █ █ █ ██ █ █ ██ ███ ███ █ █████ █ █ 145 ██ █ █ █ █ ██ █ ██ ███ ███ ██ █ █ █████ █ ██ █ ███ █ █ ██ ███ █ █ ████ ██ ██████ 146 █ █ ████ ███ █████ ███ ██ ██ ████ ██ ██ █████████ █ █ ████ ██ █ █ ██ █ ██ 147 █ █ █ █ █ █ █ █ █ ███ ██ █ ██ █ █ ██ █ █████ █ ███ ██ █ █ █ ██ ██ ██████ ██ 148 ██ ████ ██ █ ███████ ██ ██ ██ ████ ████ ██ ████ █ ███ █ ███ ██ █ ████ ███ ██ 149 █ █ █ █ █ █ █ █ █ █████ █ █ ███ █ ██ █████ ██ █ █ █ ██ █ █ █ ███ █ █ █ █ █ 150 ██ █ █ █ ███ ███ ██ ████ ███ █ ██ █ █ ██ ███ ██ █ █ ██ █ ██ █ ██ ██ █ █ █ █ █ ███ 151 █ ██ █ █ █ █ ███ ██ ███████ ███ █ █ █████ ███ █ █ ███ ███ ███ ██████ █ █ █ █████ █ 152 ████ █ ████ █ ████ ██ ████ ██ █ ██████ ███ ███ █ █ █ █ ██ ███████ ██ █ ████ ██ █ 153 ██ █ ███ ██ ██ ███ █ █ █ █ ██ ███ ██ ██ █ ████ █ █ █ ████ █ ██ █ █ █ ██ █ 154 █ █ █ ██ ███ █ ████ ██ ██ █ █ ██ ██ ██ ███ ██ ██ █ ███ ███ █ █ ███ █ 155 ███ █ █ ██ ████ █ ██ ███ █ ██ █ █ █ █ ███ ██ ███ █ █ █ █ █ █████ █ ████ ██ ████ ██ 156 █ █ █ ██ █ █ █ ███ ██████████ ██ █ ████ ██ ██ ███ ██ █ ██ █ █ █ ██ ███ █ 157 █ █ ██ █ █ █ █ ██████████ ███ █ █ █ ██ █████ █ ██ █ ████ ███ █ █ ███ ███ ██ █ 158 ███ █ ██ ██ ████ █ ████ ██ ██████ █ █ █ ██ █████ ████ ██ ████ ██████ █ ██ ██ █ 159 ██ █████ █ ██ ███ ███ █ █ █ ██████ █ ████ ████ ██ ██ ██ ██ █ █ ████ █████ ██████ 160 ██ █ █ ███ █ ████ █ ████ ██ █ ████ ██ ████ ██ █ ███ █ ███ █ █ █ ██ █ 161 █ ███ ██ ██ █ ██ ██ █ █ ███ ██ █ █ █ ██ █ █ ██ █ █ █ ██ ██ █ █ █ █ █ ██ █ 162 █████ █ ███ ███ █ █ ██ ███ ███ ██ ██ █ ███ █ ██ ███ █ ███ ██ ██ █ ██ ███ ████ ███ 163 █ ████ █ █ ███ ██ █ ██ ██ █ █ █ ██ █ █ █ █ ██ █ ██ ██████ ██ ████ ██ █ █ 164 █ █ █ ██ ██ ██ ███ █ ███ █ ██ █ █████ █ █ ██ ███████ ██ █ █ ██ ████ █████ █ █ ██ 165 █ █ █ █ ██ ██ ██ ██ █ ██ ██ ███ █ █ █ ██ █ █ █ ██ ███ █ ███ █ █ ██ 166 █ █ ████ █ ██ █ ███ ██ █ ██ █████████ ███ ██ ██ █ █ █ █ ██ ███ ██ █ 167 ███ ██ █ █ █ ██ ██ ██ ██ █ █ █ ██ █ ██ █ ██ █ ██ ██ █ █ ████ ███ █ ██ ██ █ ███ ██ 168 ███ █ ██████ █ ███ ██ ███ ██ █ ██████ ███ ███ █ ██ ██ █ ██ ██ ██ █ █ ██ ██ █ 169 ██ █ █ ██ ██ █ █ ████ ██ █ █ █ ██ █████ ██ ██ █ ███ ███ ███ █ 170 ██ ███ █ █ █ █ ██ █ ██ ████ ███ ██ █████ ██ █ ██ ██ █ █ █ ██████ █ █ ███ 171 ██ ██ █ ███ █ ███ █ █ ███ ████ ██ █ █ █ ████ █ ████ ██ ███ █ ██ ██ ████ ███ █ █ ██ ██ 172 █ █ █████ ██ █ ██ ███ █ █ █ █ █████████ ██ ██ █ █ ███ █ ██ ████████ █ ██ 173 ██ ██ ██ ██ ██ ███ █ █ ████ █ █ █ ███ █ █ █ █ ███ █ █ ██ ██ ██ █ █ 174 █ ██ █████ ██ █ ███ ██ ██ ██ █ █ █ █ █ █ █████ █ ██ █ ██ █ █ ████ ██ 175 ██ ████ ██ █ ███ ████ ███ █ ██ ██ █ ██ █ ███ ███ █ █ ██████ █ █████ ██ █ ███ █ █ 176 █ █ █ █ ███ █ █ ██ ███ █ ██ ████ █ █ █████ █ ███ ██████ █ ███ ██ ████ █ ██ █ █ 177 █ ██ ██ █ ██ █ ██ █ █ █ █ ██ ██ █ ██ █ ██ █ █ ██ ███ ███ ██ █ █ █ ██ 178 ███ ██ ██ █ █ ██ ████ ███ █ ████ ███ █ ██ █ █ █ ███ █ █ ███ █ ████ ██ █ █ ████ 179 █ █ ██ ██ █ ██ █ █ ██ ██ ███ ███ ████ ██ ███ █ ██ ██ ██ ████ █ █ ██ ██ █ 180 █ █ ██ █ █ ██ █ ████ ███████ ██ █ █ ██ █ █ ███ ███ █ ██ █ ██ █ ██ ██ █ █ ███ █ 181 ████ █████ ██ ██ █████ █ █ ██ ██ ███ █ ███ █ █ ██ ███ ███ █████ ██ █ 182 █ ███ ███ █ █ █ ██████ ███ ████ █████ ███ ███ ███ ██ █ ██ █ ██ ██ █ ███ █████ 183 █ █ ██ █ ████ █████ ███ █ █████ █ █ █ █ █ ██ ██ █ █ █ █ ███ ███ ███ █████ █ ██ █ █ █ █ 184 █ █ █ █ ██ █ ████ ███ █ █ ████████ ████ █ ██ █████ █ █ █ ███ █ █ ████ █ █ 185 ██ ███ ███ █ ██ █ █ █ ████ █ ███ ██ █ █ ██████ ██ ██ █ █ ████ █ ███ █ 186 ██ ████ ██ █ █ ████ █ ██ ██ ██ ███ █ ██ █ █ ██ █████ █████ █ █ █ █ ██ 187 █ ██ █ ███ █ █ ██ ███ ███ ██ █ ██ ███ ████ █ █ █ █ ██ █ █ █ █████ █ █ █ █ 188 █ ██ ███ ███ ███ █ █ █ ██ █ ███ ███ █ ██ █ █ ███ ██ █ ██ █ ██ ██ ██ █ 189 ███ █ █ █ ███ ███ █ █ █████ ████ █ █ ██ █████ █ ███ █ █ ███████ ████ █ ██ 190 █ ██ █████ █ ██ ███ ██ █ █ ██ ██ ██ █ █ █ █ ███ █ ██ █ ██ ██ █ █ ██ ██ ███ █ █ ██ 191 ██ █ ████ ██ █ █████ █ █ ██████ ███ █ █ ██ ██ ██ █ ██ █ █ ██ ██ █ █ █ █ █ █ █ ██ █ 192 █ ███████ █ █ ██ █ █ █ █ ████ █ █ █ █ █ ████ █ █ █ █ ██ ██ ██ ██ █ █ 193 ██ █ ████ █ █ █ ████████ █ █ ███ █ ████ █ █████ ██ ████ █ ███ ██ █ █ █ ██ █████ 194 ██ █ ██ █ █ █ █ █ █ █████████ █████ █ ███ █ ██ ██ █ ██ ███ ██ █ █ █ █ ████ █ █ ████ █ 195 █████ ████ ██ ██ █ █ █ ██████ █ █ █ █ █ █ █ ██ █ █ ███ █ █ ████ ███ ██ █ █ █ █ 196 ██ █ ███ ██████ █ █ █ ██████ ██ █ █ ██████ ███ ██ █████ ████ █ █ █ ██ ███ █ ██ ██ 197 █ ████ ██ █ █ █ █ ███ ██ █ ██ █ █ █████ ██ ██ █ ████ ███ █ █ ██ ██ ████ ███ 198 ██ ███ █ ███ █ ██ █ ██ ██ ███████ ██ █ █ ████ █ ████ ████ ███ ██ ██ ██ █ █ █ █ █ 199 ██ █ ██████ █ █ ██ ██████ █████ ███ █ ███ ██ █ ███ █ █ █ ███ █ ████ ████ ██ ██ 200 ████ █ ██ ██ █ █ █ ██ █ █ ██ █ ██ █ ███████ █ ██ ███ █ █ ███ ████ ███ █ █ █ 201 █ ██ █ █ ██ ████ ███████ ██ █ ██ █ █ ██ █ ███ █ █ █ ███ █ █ ████ █ ██ █ █ 202 ██ █ ██ ██ █ █ █ ███████ ██ █ ███ █ ███ █ ██ █ █ █ █ █ ██ ██ █ ███ ███ ██ ██ 203 █ █ ███ █ ██ █████ █ ██ █ ██ ███ █ █ █ ██ █████ █████ ███ █ ████ █ █ ███ █ 204 █ ████ █ █ █ █ ██████ ██ ██ ██ █ █ █ █ █ ██ █ ████████████ ███ ████ ███ ███ 205 █ █ █ █ ██ ██ █ █ █ ████ ██ ██ █ █ █ ██ ██ █ █ █ █ █ █ ███ █ █████ ██ ███ █ █ 206 █ █ ██ ███ █ █ ███ █ █ █ ██ ██ ████████ █ █ █████ █ █ █ ██ █ ██ ████ 207 █ █████ █ ██ ███ █ █ █ █ ███ ██ █ ██ ██ █ █████ █ █ ██ █ ███ ██ █ █ ██ █ █ █ █ 208 ███ █ █ █ █ ██ █ █ █ █ █ █ █ ███ ██ ████ ██████ █ █████ ███ ██ █ █ 209 █ █ █ ██ █ █ ████ █ █ █████ █ █ █ █ ██ ██ █ █ █ █████ █ ██ █ 210 █ ████ █ █ █ ██ ██ █ █ █ ██ ██ ██ ██ ██ █ █ █ ██ ██ ██ █ ██ █ █ ██ █ █ 211 █ ████ ███ █████ █ █ ████ ██ █████ ██ ███ █ ███ ██ ██ ██ █ █ █ ███ █ 212 █ █ ████ █ ██ █ █ ██████ ███████ █ ██ ███ ███ █ █ ██ █ ████ ███ █ ███ █ █ 213 ███ ██ █ ██ █ █ █████ ██████ █ ██████ ██ █ ██ █ ██ ███ █ █ █ █ ███ ██ ████ ██ █ 214 █ ███ █ █████ █ █ ███ ██ ██ ██ ███ █ █ █ █ █ ████ █ ████ █ ██ █ █ ██ 215 █ ████ ███ █ █ ████ █ █ ██ ███ █ ██ █ █ ██ █ █ ██ █ █ ██ ██ █████ █ █ ███ █ ████ 216 █ ██ ██ ██ ██ █ █ ██ ███ ████ ███ ████ █ ██ █ █ ███ ███ ██████ █████ ███ ████ █ 217 ██ █ ███ █ █ ███ █ ██ ███ █ ██ █████ █ ███ █ █ ██ █ █ █ ████ ██ ██ ███ █ █ █ ██ 218 █ ███ ███ ███ ██ █ ███ █ ████ ██ █ █ ███ █ ██ ██████ █ █ ███ █ ██ ██ ███ ██ █ █ 219 █ █ █ █ █ █ █ █ █ █ ██ █ █ ███ ███ █ █ █████ █ █ █ █ █ █ █ █ ██ ██ █ ██ █ 220 █ ██ █ █ ██ ██████ █ █ █ ██ █ █ ██ █ ███ █ █ █ ██ ██ █ █ ███████ 221 ██ ██ █ █ █ █ █ ██████ ██ ████ █ █ █ ██ █ █ █ █ ███ █ ███ █ █ █ ██ ███ 222 █ ████ █ ██ ██ ███ █ ██ █ ██ ████ █ █ ██ █ █ █ ███ █ ██ ██ ████ ███ 223 █ ██ ██ █ █ █ █ ███ ██ █ ████ ████ ███ ██ ██ ██ ███ █ ██████ 224 ███ ███ ██ █ █ ██ ██ █ ██ █ █ █ █ ███ █ ███ █ ██ ███ █ █████ ███ ███ ████ █ █ ██ 225 ██ █ █ ████ █ █ ███ ██ █████ █ █ ██ █ █ ██ ██ █ ███ █ █ █ █ █ █ ██ █ ██ ██ 226 ███ █████ ██ ██ █ ███ █ █ ███ ████ ██ █ █████ ██ █ ██ ████ █ █ █ 227 ███ █ █ ███ █ ██ █ █████ █ ██ ████████ ██ ████ █ ████████ █ ███ █ ████ █ █ 228 █ █ ██ █ ██ █ █ █ ██ ██ █ ██ █ ██ █ █ ██ ██ ██ █ ██ ███ ███ █ ██ ███ 229 █ ███ ██ █ █ ███ ███ ██ ██ █ █ █ █ █ ███ █ ██ ██ █ █ ███████ █ ███ ███ 230 ██ █ █ █ █ ████ ██ █ █████ ██████ █ █ █ █ █ ██ █ █ ███ █ █ █ █ ██ 231 █ █ █ █ ████ ██ ██ █ █ █ ███ █ █ █ ██ █ █ ██ █ ██ █ █ █ ██ █ ███ █ ███ ██ 232 ██ █ █ ██ ██ █ █ █ █ ███ █ ██ █ ██ █ █ █ █ ██ ██ ███ ██ ███ ██ ██████ ███ 233 ██ █ █ █ █ █ ███ ███ ████ ██ ██ ███ █ █ ████ █ ███ █ ██ ██ █ █ ███ ███ █ █ █ ███ █ 234 ██ ████ ██ █ █ █ █ █ ██ ██████ ██ █ █ █ █ █ █ █ █ ██ █ █ ████████ █ 235 ████ ██ █ █ ████ █ █ ██ █ █ █ █ ██ █ █ █ ████ █ █████ ███ ██ █ ████ ██ ███ █ █ █ █████ 236 237> 238``` 239 240## Task 1 241 242```elixir 243img 244|> Day20.enchance(alg) 245|> Day20.enchance(alg) 246|> Day20.Image.lighted() 247``` 248 249<!-- livebook:{"output":true} --> 250 251``` 2525179 253``` 254 255## Task 2 256 257```elixir 2581..50 259|> Enum.reduce(img, fn _, acc -> Day20.enchance(acc, alg) end) 260|> Day20.Image.lighted() 261``` 262 263<!-- livebook:{"output":true} --> 264 265``` 26616112 267```