Powered by AppSignal & Oban Pro

AoC 2022 Day 3

2022/day03.livemd

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, &amp;MapSet.new/1)
  |> Enum.reduce(&amp;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()