Powered by AppSignal & Oban Pro

Advent of code day 01

2023/livebooks/day-01.livemd

Advent of code day 01

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

Helpers

example = Kino.Input.textarea("Please paste your input file:")
input = Kino.Input.textarea("Please paste your input file:")

Part 01

input
|> Kino.Input.read()
|> String.split(["\n"])
|> Enum.map(fn line ->
  digits = String.replace(line, ~r/[^\d]/, "") |> String.split("", trim: true)

  with [first | _] <- digits,
       [last | _] <- Enum.reverse(digits) do
    (first <> last) |> String.to_integer()
  else
    [] -> 0
  end
end)
|> Enum.sum()

Part 02

defmodule Part2 do
  def solve(string) do
    concatenated = solve(string, "")
    last = concatenated |> String.first()
    first = concatenated |> String.last()

    String.to_integer(first <> last)
  end

  def solve("", acc), do: acc
  def solve(<<x, rest::binary>>, acc) when x in ?1..?9, do: solve(rest, <<x>> <> acc)

  def solve(<<"one", rest::binary>>, acc), do: solve("e" <> rest, "1" <> acc)
  def solve(<<"two", rest::binary>>, acc), do: solve("o" <> rest, "2" <> acc)
  def solve(<<"three", rest::binary>>, acc), do: solve("e" <> rest, "3" <> acc)
  def solve(<<"four", rest::binary>>, acc), do: solve("r" <> rest, "4" <> acc)
  def solve(<<"five", rest::binary>>, acc), do: solve("e" <> rest, "5" <> acc)
  def solve(<<"six", rest::binary>>, acc), do: solve("x" <> rest, "6" <> acc)
  def solve(<<"seven", rest::binary>>, acc), do: solve("n" <> rest, "7" <> acc)
  def solve(<<"eight", rest::binary>>, acc), do: solve("t" <> rest, "8" <> acc)
  def solve(<<"nine", rest::binary>>, acc), do: solve("e" <> rest, "9" <> acc)

  def solve(<<_, rest::binary>>, acc), do: solve(rest, acc)
end

input
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Enum.map(&Part2.solve/1)
|> Enum.sum()