Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Advent of Code 2023 - Day 16

day16.livemd

Advent of Code 2023 - Day 16

Sample

sample = ~S(
.|...\....
|.-.\.....
.....|-...
........|.
..........
.........\
..../.\\..
.-.-/..|..
.|....-|.\
..//.|....
)
"\n.|...\\....\n|.-.\\.....\n.....|-...\n........|.\n..........\n.........\\\n..../.\\\\..\n.-.-/..|..\n.|....-|.\\\n..//.|....\n"

Input

input = ~S(
\-....|\......|...............................\......-../......./...\........|......|.........................
.........-.....-............|.................-......|.\\......-...................-..|...\...................
......./.|.............-.....-......................................./................\........\..............
....|.-.........\..........|.......--.........../....|\....-.........|................./..-.................|.
...-......./...../....\...................-......../\.../...............\.............-.......................
...|............\.-......./...........|......-....................-..-.../....../......\...\.../..............
..|..|..\.....................\..........|...\.|......................\......|....|....|.\.-......-...|....-..
......../........................-......-.............\\.-............................/|........|../..........
-..........................|.......-.../..............|...................\................|........-...../...
.|............\.//.....-..........-....\......./...........................|........................|.........
.............................................-................................\..-.\................/........\
........|........................-....\..........-.........-..../....\../....\.\........\.....\.|.............
.................\..|...........-...|......../................|.-..........-./...........|.--.................
.......................-................\............\..|.....\....\....|\.....\.....-...\.....-.|............
..........................\....|.../........../..........//........\\.........................................
........................\.|..\........./.........../...||.............../................../.........-........
/...........................|.....-..../../........./.\.....................|....../.|.....|..................
....................\.../-|..../..................../.....|..............\./.....-.........../.--......../|.|.
...-........\.....|......|....|.-............................-.....|./.......-.....-.....|-.....|.............
....../............................................./..|....-..................\.....-.................//.....
\.........................|....................................................../...../...\.........-..-.....
....-../..\\.......-......../...\.................................\....-.............\.........\.....-........
............/.........../...........\....................\......../.....\.................................|../
.......\.........-....|..-|..|..............\............/.................................\......./..........
................./..........................................\...........-|......................./.........\..
|.......................-..../-/.......-........\.........................................../..../.......-....
.\.............|.........|...--....-..|..-..............................................................|\.-|.
.\....\...-\.....|./..........................\..............-......................\.....|...................
.....|......./.|......................|.................................\........./..../..........\...........
/..-...................|.......|.....-..........|...........\...-............-......|.|...................../.
....................\..../.............|............|...............................-....|.-.........\....|...
...|\.\.......\......\.....|..|.......|...\........................|.................-..-...........-.........
............../\-.|.......-...\..........-............\.../...../..|......\................./............|....
..........|............\..../........-.............\./....../.........................../.-...................
.-.\/............................./......|....\........|....../............\......-....../.........\..........
........./......../../.................\...-.\.........\............./../.....-............\..................
\.\.......-..................-........-\.....|....\-............/...\............../................./........
.........|.................-......\....\......./....|/................-.....\...........|\......|.............
.......|........\...\......................-...--........../......-...........\|...............|..\......|....
........\.................\...../....|.|..................\.....................\...........\.....-.-.........
.....\/................/...-.-...............\...................................\....|.|.-|................/.
.......\............\............\-............/......\....../.........|......-......\..-....-...-.........\..
.............../......................................|....\.............../..|................../...-...|....
.........\.../../.........................../..-........./.-...\.......-..........|.-...../..../........../...
...|.......................|./..................-................\...|.....\.-................\./......\......
|..../........|...../...................-./.....-...........|.....................-.......-..-................
.../..-.......-...........|..-...............--..............||.../...........................................
....|../...\.................../..../-..-...|.-.............\......................-....\.......-.....-.......
.\.........-....-.....|........-..............................|.........................................\....|
..|......................./.........\.......................\...............-.....././...\..|....-....././....
...--.|.......................\..|......\|........-....||../....-........|.........\.......-..../..\....-.....
-.\.........\...................-../....|............-.............../.............\......-....\..............
............\....-.....\.|...............-.......-.|..............\...........................|..-.../........
................................................\.........-....................-.......\......................
.\.....\........................|....|......-...........-\...|/...................../.........................
///.-..\.........\......./....|..........................\.|/.....................-...........-\....|..|......
-...........|.....-/...............................|.....|....................................\......-......\/
................\/............................................/.......................-........./.............
........\.....-..\..............|....................|.....\........-../....../...........\-.........-........
...../......../.........|.\........../.............\.............../......-.........................-\.../.-..
.......................\..\......../|...|.....-..........................-.|.......\....................-.....
..\......-/........./....|..\.................|...-..../|.................................-...................
.............-..........-....../............................................../..........|....................
.././.../.........\..\....|....||...............|./....-...-...............|/.......................-.........
...............-...../.\.....\............\...............................-.-...........\.............-|......
....\..............-............/..\................................\-.....-...........................\......
.....-.....|.-.........../.........|...................../..................\..../.......\.-./.............../
..\-..-....|................\...../................................|....|.|........./...........|....|........
.............|..............................-.\........../....../......\.|.......-.......-....................
........................./.............|.|........|..-............-../........-../....|.......|............-..
......./.........\.\..\..../.-.-..|./........-.|.............../......./......|....-.-...../...........\......
................./.....-....|........-\..\....\...................../....................................../..
.|.......|./.../.......|.-..........-................-...........\.......-./......./..........................
.......-..............................\.....\..-\/.|.-....................../.............|..........-...-....
............/..-..........\..\/.\.../...........-................-..........\.|....|../-....................-.
.....\......|.......|................|..\.|......\..-|-..../...........................................\...\..
........../-.|........-..-........\......|...\.......\...|................................|......-............
..|.......\....../......................||......\........-....\......|............-............/.....\.../....
..................../...\.-............\......-........\...............-..\.....|.............................
..........|.-....|....|./-.....|................../.......\......-...........././...|-...........|....-.......
....../...\................./.....-...................|-................/.-...................|.........|.../.
...........................-.................|../..|....../..........-....................../.................
......../..\...../.\...\|...../.........\..........................-...\.......\...........\................./
......-......|........./.../..|.....................|.......|...-..............-.\.....-./...\.......-..|.\...
....|...-....................|....|....|..............\..|-......|...|...........................-............
.......................|........-......\-...........-../..................../................./...............
.......|....-\.\...|...\..............--...-.......-..|...\........|\.........................-......../....\.
...\..........................-.................-......................-......\........-......................
..|.....................|.-../-....\....-................|....................../...............|.|.........|.
.\/.........-.....\............................|.............|....................\...........................
....-....................\....-....-..\.......\....................././......|.......................\........
./.......-...............-..............-...-...........................-........|...............\-.......|..|
.....-................................/.|....-/...\..-.......-..........|.....-...|..........|................
.....-..........................|...-.......|...../.\...-.........-........-\............-....-...../.../.....
......./|\...........-...............\......./.........\...................\.....\............../.|.\........\
.\/.............|...........................\-|........|..-.....................|.......................|.....
/....|..................................|......................\..-\.....|..|......................|....|.....
..................................-....../-..............\.........................................-../....\..
.......................||......./....................../.../....\.................................\.../.......
...............-..........--........\............................../...-/............/..........-.............
......../...........|....................-................|..../.............../......./..................\.\.
....\.../|..\..........|...........-.......................................................................\..
......\...|/..\...............|......\.................../................../....\........../......-..........
..............-....\............/.....|../...\....|.|..........\..........|................/..........|.......
..../\.......................-................\......-............\./......................|....|..........|..
..............|................|\.......\..-.../................/............................|................
...................-..................................................-.......|.\.........|...................
.................\....|.....\/......-........................\..................|.............................
......................................|...........\...-.....|.....|.............../.....|..\.../..............
.........../............................/...............|.....................-....\..................-.......
)
"\n\\-....|\\......|...............................\\......-../......./...\\........|......|.........................\n.........-.....-............|.................-......|.\\\\......-...................-..|...\\...................\n......./.|.............-.....-......................................./................\\........\\..............\n....|.-.........\\..........|.......--.........../....|\\....-.........|................./..-.................|.\n...-......./...../....\\...................-......../\\.../...............\\.............-.......................\n...|............\\.-......./...........|......-....................-..-.../....../......\\...\\.../..............\n..|..|..\\.....................\\..........|...\\.|......................\\......|....|....|.\\.-......-...|....-..\n......../........................-......-.............\\\\.-............................/|........|../..........\n-..........................|.......-.../..............|...................\\................|........-...../...\n.|............\\.//.....-..........-....\\......./...........................|........................|.........\n.............................................-................................\\..-.\\................/........\\\n........|........................-....\\..........-.........-..../....\\../....\\.\\........\\.....\\.|.............\n.................\\..|...........-...|......../................|.-..........-./...........|.--.................\n.......................-................\\............\\..|.....\\....\\....|\\.....\\.....-...\\.....-.|............\n..........................\\....|.../........../..........//........\\\\.........................................\n........................\\.|..\\........./.........../...||.............../................../.........-........\n/...........................|.....-..../../........./.\\.....................|....../.|.....|..................\n....................\\.../-|..../..................../.....|..............\\./.....-.........../.--......../|.|.\n...-........\\.....|......|....|.-............................-.....|./.......-.....-.....|-.....|.............\n....../............................................./..|....-..................\\.....-.................//.....\n\\.........................|....................................................../...../...\\.........-..-.....\n....-../..\\\\.......-......../...\\.................................\\....-.............\\.........\\.....-........\n............/.........../...........\\....................\\......../.....\\.................................|../\n.......\\.........-....|..-|..|..............\\............/.................................\\......./..........\n................./..........................................\\...........-|......................./.........\\..\n|.......................-..../-/.......-........\\.........................................../..../.......-....\n.\\.............|.........|...--....-..|..-..............................................................|\\.-|.\n.\\....\\...-\\.....|./..........................\\..............-......................\\.....|...................\n.....|......./.|......................|.................................\\........./..../..........\\...........\n/..-...................|.......|.....-..........|...........\\...-............-......|.|...................../.\n....................\\..../.............|............|...............................-....|.-.........\\....|...\n...|\\.\\.......\\......\\.....|..|.......|...\\........................|.................-..-...........-.........\n............../\\-.|.......-...\\..........-............\\.../...../..|......\\................./............|....\n..........|............\\..../........-.............\\./....../.........................../.-...................\n.-.\\/............................./......|....\\........|....../............\\......-....../.........\\..........\n........./......../../.................\\...-.\\.........\\............./../.....-............\\..................\n\\.\\.......-..................-........-\\.....|....\\-............/...\\............../..............." <> ...

Part 1

defmodule Part1 do
  def parse(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.with_index()
    |> Enum.reduce(
      {%{}, 0, 0},
      fn {row, y}, acc ->
        row
        |> String.graphemes()
        |> Enum.with_index()
        |> Enum.reduce(
          acc,
          fn {char, x}, {map, max_x, max_y} ->
            {
              Map.put(map, {x, y}, char),
              max(max_x, x),
              max(max_y, y)
            }
          end
        )
      end
    )
  end

  def move({x, y, dir}, ".", max_x, max_y) do
    {nx, ny} =
      case dir do
        :east -> {x + 1, y}
        :west -> {x - 1, y}
        :north -> {x, y - 1}
        :south -> {x, y + 1}
      end

    if nx >= 0 &amp;&amp; nx <= max_x &amp;&amp; ny >= 0 &amp;&amp; ny <= max_y do
      [{nx, ny, dir}]
    else
      []
    end
  end

  def move({x, y, dir}, "\\", max_x, max_y) do
    new_dir =
      case dir do
        :east -> :south
        :west -> :north
        :north -> :west
        :south -> :east
      end

    move({x, y, new_dir}, ".", max_x, max_y)
  end

  def move({x, y, dir}, "/", max_x, max_y) do
    new_dir =
      case dir do
        :east -> :north
        :west -> :south
        :north -> :east
        :south -> :west
      end

    move({x, y, new_dir}, ".", max_x, max_y)
  end

  def move({x, y, dir}, "-", max_x, max_y) do
    if dir == :east || dir == :west do
      move({x, y, dir}, ".", max_x, max_y)
    else
      move({x, y, :west}, ".", max_x, max_y) ++
        move({x, y, :east}, ".", max_x, max_y)
    end
  end

  def move({x, y, dir}, "|", max_x, max_y) do
    if dir == :north || dir == :south do
      move({x, y, dir}, ".", max_x, max_y)
    else
      move({x, y, :north}, ".", max_x, max_y) ++
        move({x, y, :south}, ".", max_x, max_y)
    end
  end

  def energize([], visited, _grid, _max_x, _max_y) do
    visited
    |> Enum.map(fn {x, y, _} -> {x, y} end)
    |> MapSet.new()
    |> MapSet.size()
  end

  def energize(q, visited, grid, max_x, max_y) do
    [head | tail] = q

    if MapSet.member?(visited, head) do
      energize(tail, visited, grid, max_x, max_y)
    else
      {x, y, _} = head

      energize(
        tail ++ move(head, grid[{x, y}], max_x, max_y),
        MapSet.put(visited, head),
        grid,
        max_x,
        max_y
      )
    end
  end
end

{grid, max_x, max_y} = Part1.parse(input)
Part1.energize([{0, 0, :east}], MapSet.new(), grid, max_x, max_y)
7199

Part 2

{grid, max_x, max_y} = Part1.parse(input)

starts =
  (0..max_x
   |> Enum.flat_map(fn x ->
     [{x, 0, :south}, {x, max_y, :north}]
   end)) ++
    (0..max_y
     |> Enum.flat_map(fn y ->
       [{0, y, :east}, {max_x, y, :west}]
     end))

starts
|> Enum.map(fn start ->
  Task.async(fn -> Part1.energize([start], MapSet.new(), grid, max_x, max_y) end)
end)
|> Enum.map(&amp;Task.await/1)
|> Enum.max()
7438