AoC 2022 Day 3
Mix.install([:kino])
defmodule Utils do
def split(line, sep \\ "") do
String.split(line, sep, trim: true)
end
def split_all_lines(text, sep \\ "") do
text
|> String.split("\n", trim: true)
|> Enum.map(&split(&1, sep))
end
def to_numbers(number) when is_binary(number) do
String.to_integer(number)
end
def to_numbers(numbers) when is_list(numbers) do
Enum.map(numbers, &to_numbers/1)
end
def to_matrix(text, sep \\ "") do
text
|> split_all_lines(sep)
|> then(fn data ->
for {row, r} <- Enum.with_index(data), {col, c} <- Enum.with_index(row) do
{{r, c}, col}
end
end)
|> Map.new()
end
end
Setup
import Utils
input = Kino.Input.textarea("Input:")
text = Kino.Input.read(input)
data = split_all_lines(text, "")
P1
for rack <- data do
[l, r] = rack |> Enum.chunk_every(length(rack) |> div(2))
[<>] = Enum.uniq(l -- l -- r)
v = item - ?a + 1
if v < 0, do: v + ?a - ?A + 26, else: v
end
|> Enum.sum()
P2
for group <- Enum.chunk_every(data, 3) do
Enum.map(group, &MapSet.new/1)
|> Enum.reduce(&MapSet.intersection/2)
|> Enum.to_list()
|> then(fn [<>] ->
v = item - ?a + 1
if v < 0, do: v + ?a - ?A + 26, else: v
end)
end
|> Enum.sum()