this repo has no description
at master 2.8 kB view raw
1# Day 07 2 3```elixir 4Mix.install([:kino_aoc, :image]) 5``` 6 7## Parse 8 9<!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiI3Iiwic2Vzc2lvbl9zZWNyZXQiOiJBRFZFTlRfT0ZfQ09ERV9TRVNTSU9OIiwieWVhciI6IjIwMjUifQ","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} --> 10 11```elixir 12{:ok, puzzle_input} = 13 KinoAOC.download_puzzle("2025", "7", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION")) 14``` 15 16```elixir 17[start | rest] = String.split(puzzle_input) 18 19start_col = byte_size(start) - byte_size(String.trim_leading(start, ".")) 20``` 21 22```elixir 23splitters = 24 Enum.map(rest, fn row -> 25 row 26 |> String.to_charlist() 27 |> Enum.with_index() 28 |> Enum.filter(&(elem(&1, 0) == ?^)) 29 |> MapSet.new(&elem(&1, 1)) 30 end) 31``` 32 33<!-- livebook:{"branch_parent_index":0} --> 34 35## Part 1 36 37```elixir 38Enum.reduce(splitters, {MapSet.new([start_col]), 0}, fn splits, {beams, count} -> 39 import MapSet, only: [intersection: 2, difference: 2, union: 2] 40 41 hits = intersection(beams, splits) 42 new_beams = for hit <- hits, dx <- [-1, 1], into: MapSet.new(), do: hit + dx 43 beams = beams |> difference(hits) |> union(new_beams) 44 45 {beams, MapSet.size(hits) + count} 46end) 47``` 48 49<!-- livebook:{"branch_parent_index":0} --> 50 51## Part 2 52 53```elixir 54Enum.reduce(splitters, %{start_col => 1}, fn splits, beams -> 55 Enum.reduce(splits, beams, fn s, acc -> 56 case Map.pop(acc, s) do 57 {nil, map} -> 58 map 59 60 {count, map} -> 61 Map.merge( 62 map, 63 %{ 64 (s + 1) => count, 65 (s - 1) => count 66 }, 67 fn _k, a, b -> a + b end 68 ) 69 end 70 end) 71end) 72|> Enum.sum_by(&elem(&1, 1)) 73``` 74 75<!-- livebook:{"branch_parent_index":0} --> 76 77## Image 78 79```elixir 80height = length([start | rest]) 81width = byte_size(start) 82 83{height, width} 84``` 85 86```elixir 87Image.new!(width, height) 88|> Image.mutate(fn img -> 89 Image.Draw.point!(img, start_col, 0, color: :yellow) 90 91 splitters 92 |> Enum.with_index(1) 93 |> Enum.reduce(MapSet.new([start_col]), fn {splits, y}, beams -> 94 import MapSet, only: [intersection: 2, difference: 2, union: 2] 95 96 for x <- beams do 97 Image.Draw.point(img, x, y, color: :green) 98 end 99 100 for x <- splits do 101 Image.Draw.point(img, x, y, color: :red) 102 end 103 104 hits = intersection(beams, splits) 105 new_beams = for hit <- hits, dx <- [-1, 1], into: MapSet.new(), do: hit + dx 106 beams = beams |> difference(hits) |> union(new_beams) 107 108 beams 109 end) 110 111 img 112end) 113|> then(fn {:ok, img} -> img end) 114|> Image.resize!(5, interpolate: :nearest) 115``` 116 117<!-- livebook:{"offset":2553,"stamp":{"token":"XCP.6lQNAY-yntHErm41fMi4xgwAxGSGZ7l6ekgYSe6b3Exm48kBKgyIoCK62LLVaeQP-1PfZFpd3tzHwAIA8OWTsnRBuWsxmex5qixMa-l4DaThm-jrSaVsE3Qj4aO-TrqdqA","version":2}} -->