AoC 2022 - day 03
Mix.install([:kino])
Section
input = Kino.Input.textarea("input")
defmodule Day01 do
def solve1(input) do
input
|> String.split("\n", trim: true)
|> Enum.map(fn l ->
l
|> String.codepoints()
|> Enum.split(div(String.length(l), 2))
|> (fn {a, b} -> {MapSet.new(a), MapSet.new(b)} end).()
end)
|> Enum.map(fn {a, b} ->
MapSet.intersection(a, b)
end)
|> Enum.map(&score/1)
|> Enum.sum()
end
def solve2(input) do
input
|> String.split("\n", trim: true)
|> Enum.map(&String.codepoints/1)
|> Enum.map(&MapSet.new/1)
|> Enum.chunk_every(3)
|> Enum.map(fn [a, b, c] ->
MapSet.intersection(a, b) |> MapSet.intersection(c)
end)
|> Enum.map(&score/1)
|> Enum.sum()
end
defp score(c) do
[c] = MapSet.to_list(c)
cond do
c >= "a" ->
:binary.first(c) - 96
true ->
:binary.first(c) - 64 + 26
end
end
end
Kino.Input.read(input) |> Day01.solve1()
Kino.Input.read(input) |> Day01.solve2()