Powered by AppSignal & Oban Pro

Day 03

2022/livebooks/day-03.livemd

Day 03

Mix.install([
  {:kino, "~> 0.5.0"}
])

Setup

defmodule Helper do
  def priority(c) when c in ?a..?z, do: c - 96
  def priority(c) when c in ?A..?Z, do: c - 38
end
input = Kino.Input.textarea("Please paste your input file:")
input =
  input
  |> Kino.Input.read()
  |> String.split("\n")

Part 01

input
|> Enum.reduce(0, fn element, acc ->
  {first, last} = String.split_at(element, round(String.length(element) / 2))

  first = :binary.bin_to_list(first) |> Enum.map(&Helper.priority/1)
  last = :binary.bin_to_list(last) |> Enum.map(&Helper.priority/1)

  diff = List.myers_difference(first, last)

  Enum.sum(diff[:eq]) + acc
end)

Part 02

input
|> Enum.chunk_every(3)
|> Enum.reduce(0, fn [first, second | [third | _tail]], acc ->
  first = :binary.bin_to_list(first) |> Enum.map(&Helper.priority/1) |> Enum.uniq()
  second = :binary.bin_to_list(second) |> Enum.map(&Helper.priority/1) |> Enum.uniq()
  third = :binary.bin_to_list(third) |> Enum.map(&Helper.priority/1) |> Enum.uniq()

  sum_of_intersection =
    first
    |> Enum.filter(fn e -> Enum.member?(third, e) && Enum.member?(second, e) end)
    |> Enum.sum()

  sum_of_intersection + acc
end)