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

aoc 2019 day 6

2019/elixir/day-6.livemd

aoc 2019 day 6

Setup

Mix.install([{:kino, "~> 0.5.1"}])
input = Kino.Input.textarea("input")
adj_map =
  input
  |> Kino.Input.read()
  |> String.split([")", "\n"], trim: true)
  |> Enum.chunk_every(2)
  |> Enum.reduce(%{}, fn [a, b], adj_map ->
    adj_map
    |> Map.put(b, a)
  end)

Part 1

defmodule Part1 do
  def orbits(adj_map) do
    Map.keys(adj_map)
    |> Enum.map(&orbits(&1, adj_map, 0))
    |> Enum.sum()
  end

  defp orbits(nil, _adj_map, orbit), do: orbit - 1

  defp orbits(key, adj_map, orbit) do
    orbits(adj_map[key], adj_map, orbit + 1)
  end
end
adj_map
|> Part1.orbits()

Part 2

defmodule Part2 do
  def transfer_orbits(adj_map, source, dest) do
    source_path = orbit_paths(adj_map, source, [])
    dest_path = orbit_paths(adj_map, dest, [])
    [eq: _eq, del: del, ins: ins] = List.myers_difference(source_path, dest_path)
    length(del) + length(ins)
  end

  def orbit_paths(_adj_map, nil, paths), do: tl(paths)

  def orbit_paths(adj_map, x, paths) do
    orbit_paths(adj_map, adj_map[x], [adj_map[x] | paths])
  end
end
Part2.transfer_orbits(adj_map, "YOU", "SAN")