Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Day 1

2023/day_1.livemd

Day 1

Mix.install([:kino])

Get input

input =
  Kino.Input.textarea("Paste input here",
    default: """
    1abc2
    pqr3stu8vwx
    a1b2c3d4e5f
    treb7uchet
    """
  )
defmodule Helper do
  def is_numeric_string?(str) do
    case Integer.parse(str, 10) do
      {_, ""} -> true
      _ -> false
    end
  end
end

Part 1

input
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Stream.map(fn line ->
  line
  |> String.split("", trim: true)
  |> Stream.filter(&Helper.is_numeric_string?/1)
  |> Enum.into([])
end)
|> Stream.map(&"#{List.first(&1)}#{List.last(&1)}")
|> Stream.map(&Integer.parse/1)
|> Stream.map(fn
  {i, _} -> i
  :error -> 0
end)
|> Enum.sum()

Part 2

digits = %{
  "one" => "o1e",
  "two" => "t2o",
  "three" => "t3e",
  "four" => "f4r",
  "five" => "f5e",
  "six" => "s6x",
  "seven" => "s7n",
  "eight" => "e8t",
  "nine" => "n9e"
}

input
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Stream.map(fn line ->
  Enum.reduce(digits, line, fn {word, value}, acc -> String.replace(acc, word, value) end)
end)
|> Stream.map(fn line ->
  line
  |> String.split("", trim: true)
  |> Stream.filter(&Helper.is_numeric_string?/1)
  |> Enum.into([])
end)
|> Stream.map(&"#{List.first(&1)}#{List.last(&1)}")
|> Stream.map(&Integer.parse/1)
|> Stream.map(fn
  {i, _} -> i
  :error -> 0
end)
|> Enum.sum()