this repo has no description
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## Part 1 34 35```elixir 36Enum.reduce(splitters, {MapSet.new([start_col]), 0}, fn splits, {beams, count} -> 37 import MapSet, only: [intersection: 2, difference: 2, union: 2] 38 39 hits = intersection(beams, splits) 40 new_beams = for hit <- hits, dx <- [-1, 1], into: MapSet.new(), do: hit + dx 41 beams = beams |> difference(hits) |> union(new_beams) 42 43 {beams, MapSet.size(hits) + count} 44end) 45``` 46 47<!-- livebook:{"branch_parent_index":0} --> 48 49## Part 2 50 51```elixir 52Enum.reduce(splitters, %{start_col => 1}, fn splits, beams -> 53 Enum.reduce(splits, beams, fn s, acc -> 54 case Map.pop(acc, s) do 55 {nil, map} -> 56 map 57 58 {count, map} -> 59 Map.merge( 60 map, 61 %{ 62 (s + 1) => count, 63 (s - 1) => count 64 }, 65 fn _k, a, b -> a + b end 66 ) 67 end 68 end) 69end) 70|> Enum.sum_by(&elem(&1, 1)) 71``` 72 73<!-- livebook:{"branch_parent_index":0} --> 74 75## Image 76 77```elixir 78height = length([start | rest]) 79width = byte_size(start) 80 81{height, width} 82``` 83 84```elixir 85Image.new!(width, height) 86|> Image.mutate(fn img -> 87 Image.Draw.point!(img, start_col, 0, color: :yellow) 88 89 splitters 90 |> Enum.with_index(1) 91 |> Enum.reduce(MapSet.new([start_col]), fn {splits, y}, beams -> 92 import MapSet, only: [intersection: 2, difference: 2, union: 2] 93 94 for x <- beams do 95 Image.Draw.point!(img, x, y, color: :green) 96 end 97 98 for x <- splits do 99 Image.Draw.point!(img, x, y, color: :red) 100 end 101 102 hits = intersection(beams, splits) 103 new_beams = for hit <- hits, dx <- [-1, 1], into: MapSet.new(), do: hit + dx 104 beams = beams |> difference(hits) |> union(new_beams) 105 106 beams 107 end) 108 109 #for {row, y} <- Enum.with_index(splitters, 1), 110 # x <- row, 111 # do: Image.Draw.point!(img, x, y, color: :red) 112 113 img 114end) 115|> then(fn {:ok, img} -> img end) 116|> Image.resize!(5, interpolate: :nearest) 117``` 118 119<!-- livebook:{"offset":2629,"stamp":{"token":"XCP.lHomXHh84XridtwMBP5AP7BXVVCvUC-jx1w-h7SzIFygBNyHhdS1qTLyp97LGQ3Rf1f4to4IjQtJmlsi-0PrxC2vUjGg97fvP9zvt5n0IxMkwLnFfvafaIDjJSsZLX1Bcg","version":2}} -->