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)