From 07674d6f0e61ca77c4522abe28bf2d9a07c90a5f Mon Sep 17 00:00:00 2001 From: Pim Kunis Date: Thu, 21 Dec 2023 08:43:56 +0100 Subject: [PATCH] add day21a --- 23/elixir/inputs/day21.txt | 131 +++++++++++++++++++++++++++++ 23/elixir/inputs/day21_example.txt | 11 +++ 23/elixir/lib/days/day21.ex | 67 +++++++++++++++ 3 files changed, 209 insertions(+) create mode 100644 23/elixir/inputs/day21.txt create mode 100644 23/elixir/inputs/day21_example.txt create mode 100644 23/elixir/lib/days/day21.ex diff --git a/23/elixir/inputs/day21.txt b/23/elixir/inputs/day21.txt new file mode 100644 index 0000000..e430d3c --- /dev/null +++ b/23/elixir/inputs/day21.txt @@ -0,0 +1,131 @@ +................................................................................................................................... +...................#.....#.....#.#.............#.#......#.......................#......#.......#......#...#...#.##..........##..... +......#......#.....#....#........#...............#..........................#................#...........#...#......#.....#.##.#... +..#.........#......#........##..##.#............#.#.#.#...................##....#......#.#............#...........#................ +.#...............#....###.#....#...........#........##..............................#...............##.............#....#.......... +............#.............##..#.#.....#..........#...#....................###...#.......#...........#.......##.#.........#......... +.................#..........#..#..#.....##..#........#..........#............#...##.#..............#.....#.........#....#..#....... +...#.......#..........#..#......###............#...#.#......................#.....#........###.#.............#..#....#..........#.. +.................#...#........................................................#.#..................##...#.#.#....#...##..........#. +....#..........#...##...#...........#...........#................................#..#.............#.#...........#....#........#.... +.....#....##...#........#......#.#..............#..........#......#..............#.......#...................#.......#...##..#...#. +......#...#.#....#...............#............#.....................#................#...###.#...#..........#.##...#............... +.....##..#............#..#.........#..#....#...............#..............................#.#.......................#............#. +.........##.....#.....#.........#.....#....#...............#.##.#....................#........................#..#..#...........#.. +......#.##.............#......#.##.............................#......#..#..........#....#.#.......#...#.#...#.......#.#........#.. +...................#..........#...........#.................#......#.......#..................#.....#...........#.#...#............ +.....#.........##........#.........#.#.#.##..............#....#..........##.............###.##.....#......##.##.#...............#.. +.#..#.....#...#..#......#..........................................#..........................#.....#......#....................... +.....#.#....#..........#............#.....##.................#................................#.##..#...........#............#..... +............#.......#...#.#......#.............................#...............................#..........#................#.....#. +.......#.....##..........##.#.........#...............................#......#.#..........................#......#......##.....#... +......#.#.......#..#..#..#............................##.#....##..........#...............#.......#.............##.....##.......... +................#..#.........#.....#...........#...##.#.....#.......#......#...............#..#......##........#...#.#............. +.#............#..#.#.#....#....#.............................#.........#...........#................#....#...#....#...#.#...#...... +.................#......#......##..............#.........#........#.........#...#....#............#.#..#...................#..##... +........#..........#..........................##..#....#...............................................#......#...........##..#.... +........#.#.#..........#...#....................#....#..#....#.........#...#..#.................#......#..##......#..........#..... +...............#..................#.................................#..#....#..#..#...................#.......#............#....... +.#.#..............#......#.............................................#..............##....................#...........#......#.#. +.#.........#.....#............#...............#...........#.......#......#........................#...#..................#......... +......#.........#....#.....................#.#..................#....#....#.....###..#.#.............#..#.......................... +...#....#................................#.....#.#...........#.................#.................................#.......#.....#.#. +...#...#..##...........#..............#....................#.........#.#....#....##..................#....#...#.................... +......#..........#........#...........................##........#.#.....#.....#.......#...............#.......#.................... +.......#..........##..#.#..........................#.#........#.#...........#...........#....#.........#..................#.#...... +....................#....................#.........#...#......#.......#.......##................................................... +..........#............#..........#........#...........#......................#..........................##.#..#.........#...#..... +......#.....#.....................#.##.........#...#............#.#...........#...#.#............#.........##......#..........#.... +.....#..........#.....#..............#.......#..##...........#.............#..#....#...#.......................##...........##...#. +.#..........#...#....................#...#......#..#.................#........#..........#...#...#..#.........#.........#....#..... +......#......#.....................#.......#.....#.........................##............#.#..##.................#...#...###....... +.......#.......#...................#..........#...#.....#......................#......##.....#.................#.............#..... +......#.....#..#..................#............................#....#.#..#..##..................................................... +.....#..#....#..#.#...............#......#.............#..#...........#.....#....#..#......#.#.....................##.#............ +....#.......#..#.........#........#....#.#..................##......#..........#........................#.............#.....#...... +.#.....#......#........................#..#..............................#..........#.......#.......##...#...........#............. +...........................#.........#....##.....#.#....#...###...######...#.#......#...............#..........................##.. +..#......#................#.#......#.#.............#..#......#....#..#..#..#.........................##.........................#.. +...#........#.........#.##..............................##.#....#.......#.......#.......................#.#.#...............#....#. +.......#..#.......................#..............#..........................#.#.....#.....#............#..............#..#.#.....#. +..#.........................##......................#.........#.#.#.#........#.................#.....#..#.#........................ +..................#.......#.................#.#...................#.......#.#...........#......##...........................#...... +.......................#.#.....##...#.#.....#...#...#.##...#.............#.....................##.##............................... +..#...............#.....#......#.....###.......................#............#.............#.#.....#.#.#............................ +.......#...................#......#...#....................#.#...............#..........................#..#................#..#... +...........................#..........##..#..........#................................#..##..#.......##....#....#...........#...... +...##.............#...##.....#.......#...............#.....###..#.........#.............#....#........#...#.....#.#................ +.#...................#...##...........#............##........................#....#....#.....#........#......#...................#. +..............#.#..........#................................#...........#..#..............##..##...#.......#.......#..#..........#. +...............#........#........#..............#....#.........#.......#..........#.......#.#............#......#.#...#.........#.. +.........#.......###...#.#...#..................#..#.......#...##...#.....##............#..#.......#............................... +............#......#.......................#..........#...#........#.#.......#....................#......#......#....#....#........ +.........##.....#.......................................#...........#........................#.........#........................... +..........##.........#.....#.......#.................##..#.#......##...............#....#...#..#..#...##..#.##.#.....#.#.#......... +.......................#..............#......##.#.#.#...................##....##........#....#.....................#............... +.................................................................S................................................................. +.....#............#................#..###............#..##....#.#......#...........#..........#...#................................ +...........#.......#...#.........#....#........#..#................#.........#.#......................#....#....#.........#.#...... +................#..#........................#..#................#......#..#.......#...........##...#...............#............... +............#....#...#.....#.##.............#.#..............#.#...#........#...........#..#...##.........................#........ +.#.........##.#..#...#.....#.#....##.#.#.....#.................#...#.........................#............#.#.#....#............... +.#...........#.#..........#......................#...#......##............#....................#......##.......#........#.......... +..#......................#.#.............#..#.........................#........##.#.#...#..#.#...................#................. +.........................................#.#...#.#............#.............#...........#.#..#.#.#.......#.#.....#..#.............. +....#........................#........#...#...........#..#..................##.#.#...........#....#.#......#...................#.#. +......#..........#.......##....#..........#.....#.............#.#......#..........#....#...........#.......#.......#...........#... +...#............#........#..#...........#........#..###.....#..#..........#...........#.........#.........#...##.###............##. +.......#........#....#.#.#.........#..#...............#..#........#.......#.................#.......#...#........#..............#.. +.......................#............#.....#......#............#....#.....#.#..#..........#.......#...#........#..........#......... +...#..............#...................#.....#.........#....#.........#.......#.#.............##........#....#...#.................. +..........#..........#......#.............#....................#..#.......#.#.#....##...#.#................................#....... +..#...........................#.......................................#....#..........#....................#................#....#. +......................#.#...............#.......#.........#....##.................#......#..........#....................##......#. +.........#...#............#...............##.....#......#..#........#.....#...#............#....................................#.. +......##..#.#...........#..#...........###.....#........................##.....................#........#.......................... +............#...............#....#..#..............#.................#......#.#..#..........#..................................#... +.............#.##...................................#.........##...#.....................................#.................#.#...#. +.#...........................#............#............#.####..........................#.#...#.#.....#...........#................. +.....#...........#.#.................#....#....#....##.#.....#.....#...#............##...#.#....................#.#.#..#..#..#..... +........#.#..#..#...........#.........#..#.....#.##.#........#......................#........#.....##...........#......#........... +............#..#................#......#.#.#............#...#...........#....#..#..............................................#.#. +......#...#............................................................#...#................#.##............#.....#....#.......#... +..#..........#...#.....................#............#........#.......#.##....#...#.............#........................##......#.. +..#....#.#..........................#.#......#.......#..........#......#..........#......#.....#...............#.##.....#...#...... +.................#......##........#....................#..#.......#........#.......#.#.....................#...................#... +....####..............##...........#.........#....#......#.....................#.#...#.....#.#...............#.#................... +......#.....#.............................#.........#..#..#.....#.#............##......##..#............#..#....#......#...#...###. +.#........#............#...#..............#..............##....#......#...#.#.#.........#..#.#........#...........#...##....#...... +.......#......#..#.....#.....................#....#..#..............#...............#....................#....#...##..#.......#.##. +........#.........#....###...#...........#..........#..........#....#....#...........#......#...........#...#..........#.......#... +....#...........#.......#...##.........#...#...#...#......#..............#......................................#.......##....##... +.....##..#..........#..#...#.................##.........................#..#............................#......#.#..............#.. +.#.#.##...............#.........#...............................#..#....##.#......#...#..#.............#................#.......... +.....................#....#.....#............#..#.#.....#...........#......#..........................#................###...#..... +.#.......#..#.....................##..........#.............................##......#.................#...............#.....#.##... +..#..............#...#.#........................#..#..................##.......#..............##.#..................##............. +............#..........#.................................................#......#..#.#.........#...#....................#....#..... +.......#.................#.....................#.....#..##....................#.........................#........#...#....#.##..... +.#..............###.....#.........#...................#....#............#..#.................#......##....##.#.#.........#......... +..................#.#.................................#.......##..#..#.#..#.#.#.........................#...#..........#...#....... +.......##...#...##...#.............................................#...#.........................#..........##.....###...#.....#... +.......#........#..#...#....#..........#.#........#........#......#..#...................#........#.#....##.#......#.#.........#... +..#....#..........#.#..#...........#.....................#..#...#.#...#..#..#..............#......#..#.......#..##..#.............. +..........#.........#...##..........#...#..........................#.........................#.................#.....#.....#.....#. +............#......#..#...............#.....#..................#.......#....................#...#....#...#......#........#...#..... +.##........................#....##.#....................#.....#...........#...........#...#........#...#..........#..#......#...... +...#....................#...............#...............................#....................................#....#.#..........#... +......................#.............##....#.............#....#..#.#.......#............##............#.#.##.........#......#...#... +..#..#..........#.##.........#......##...#......................#...................#.................#..................##........ +.........#............##.#....#......#....##.#.#..........#.......#...#.............#........................#..........#.......... +.....#..#............#..............#..#..............................#................#.....#...........................#.#.#..... +........#..#.##...#..#..##.#....#..........##.................##..#...............#.#....#..........#.........##..##............... +..........#..........#....#..#.............#.................#.....#..............#...........##......##........................... +.#....##...#...........#.................##....................................#..#..........................#...........#......... +.............................#............#..#......#...........................##..............#.#...#............#.......##.#.... +....#...........#..##....##.#......##.....##........#..##.................#.........................#.......##.#.#...#...#......... +..........#...#............#....#....#..##.....#.........#........................#..............#.......................#.....#... +..#.....#....#...#..##.#..........#.#.....#...............#..............#.##..#...#..........#.....#.#.........##.##.....#......#. +......#....#.........#............#.....................##................#..#.............#..............#....#.............#..... +.......#...........#......#........#.............#...#......#................#.#.#........#.....#.#.#....#.######......#........... +................................................................................................................................... diff --git a/23/elixir/inputs/day21_example.txt b/23/elixir/inputs/day21_example.txt new file mode 100644 index 0000000..9e1d842 --- /dev/null +++ b/23/elixir/inputs/day21_example.txt @@ -0,0 +1,11 @@ +........... +.....###.#. +.###.##..#. +..#.#...#.. +....#.#.... +.##..S####. +.##..#...#. +.......##.. +.##.#.####. +.##..##.##. +........... diff --git a/23/elixir/lib/days/day21.ex b/23/elixir/lib/days/day21.ex new file mode 100644 index 0000000..9ac3c9f --- /dev/null +++ b/23/elixir/lib/days/day21.ex @@ -0,0 +1,67 @@ +defmodule AOC.Day21 do + # use AOC.Day, day: 21, input: "example" + use AOC.Day, day: 21 + + def parse_input(lines) do + map = + lines + |> Enum.with_index() + |> Enum.flat_map(fn {line, y} -> + line + |> String.to_charlist() + |> Enum.with_index() + |> Enum.map(fn {tile, x} -> {{y, x}, tile} end) + end) + |> Enum.into(%{}) + + start_position = + map + |> Enum.find(fn {_, tile} -> tile == ?S end) + |> elem(0) + + {Map.put(map, start_position, ?.), start_position} + end + + def walk(map, start_position, steps) do + map + |> do_walk(start_position, steps) + |> Enum.count() + end + + def do_walk(map, position, _) when not is_map_key(map, position), do: [] + def do_walk(map, position, _) when :erlang.map_get(position, map) == ?#, do: [] + def do_walk(_map, position, 0), do: [position] + + def do_walk(map, {y, x} = position, steps_left) do + case :ets.lookup(:steps_memo, {position, steps_left}) do + [] -> + reachable = + [{y - 1, x}, {y, x + 1}, {y + 1, x}, {y, x - 1}] + |> Enum.flat_map(fn neighbor_position -> + do_walk(map, neighbor_position, steps_left - 1) + end) + |> Enum.uniq() + + :ets.insert(:steps_memo, {{position, steps_left}, reachable}) + + reachable + + [{_, reachable}] -> + reachable + end + end + + def part1({map, start_position}) do + :ets.new(:steps_memo, [:named_table]) + + map + |> walk(start_position, 64) + |> IO.inspect() + + "TODO" + end + + def part2(_input) do + "TODO" + end +end