Powered by AppSignal & Oban Pro

Day 12

day_12.livemd

Day 12

Setup

Mix.install([
  {:kino, "~> 0.4.1"}
])
input = Kino.Input.textarea("Please provide your input: ")
input =
  input
  |> Kino.Input.read()
  |> String.split("\n")
  |> Enum.map(fn connection -> String.split(connection, "-") end)

Part 1

defmodule AdventOfCode.DayTwelve do
  def find_paths(current, path, graph, seen) do
    graph[current]
    |> Enum.reject(&MapSet.member?(seen, &1))
    |> Enum.flat_map(fn
      "end" ->
        [["end" | path]]

      current ->
        find_paths(
          current,
          [current | path],
          graph,
          if(lower?(current), do: MapSet.put(seen, current), else: seen)
        )
    end)
  end

  def lower?(string), do: string == String.downcase(string, :ascii)

  def graph(paths) do
    paths
    |> Enum.reduce(%{}, fn [node_1, node_2], map ->
      map
      |> Map.update(node_1, MapSet.new([node_2]), &MapSet.put(&1, node_2))
      |> Map.update(node_2, MapSet.new([node_1]), &MapSet.put(&1, node_1))
    end)
    |> IO.inspect()
  end
end

graph = AdventOfCode.DayTwelve.graph(input)

AdventOfCode.DayTwelve.find_paths("start", ["start"], graph, MapSet.new(["start"]))
|> Enum.count()