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

Advent of Code - Day 01

01.livemd

Advent of Code - Day 01

Mix.install([
  {:kino_aoc, "~> 0.1"}
])

Introduction

–> Content

Puzzle

{:ok, puzzle_input} =
  KinoAOC.download_puzzle("2023", "1", System.fetch_env!("LB_AOC_SESSION"))

Parser

Code - Parser

defmodule Parser do
  def parse(input) do
    numbers =
      Regex.scan(~r/(\d)/, input, capture: :first)
      |> List.flatten()

    "#{List.first(numbers)}#{List.last(numbers)}"
    |> String.to_integer()
  end

  def parse2(input) do
    numbers =
      numbers =
      Regex.scan(~r/(?=(\d|one|two|three|four|five|six|seven|eight|nine))/, input)
      |> Enum.map(&Enum.drop(&1, 1))
      |> List.flatten()

    "#{List.first(numbers) |> entry_to_number()}#{List.last(numbers) |> entry_to_number()}"
    |> String.to_integer()
  end

  defp entry_to_number(entry) do
    case entry do
      "one" -> "1"
      "two" -> "2"
      "three" -> "3"
      "four" -> "4"
      "five" -> "5"
      "six" -> "6"
      "seven" -> "7"
      "eight" -> "8"
      "nine" -> "9"
      number -> number
    end
  end
end

Tests - Parser

ExUnit.start(autorun: false)

defmodule ParserTest do
  use ExUnit.Case, async: true
  import Parser

  @input "a1b2c3d4e5f"
  @expected 15

  test "parse test" do
    actual = parse(@input)
    assert actual == @expected
  end

  @input "7pqrstsixteen"
  @expected 76

  test "parse2 test" do
    actual = parse2(@input)
    assert actual == @expected
  end
end

ExUnit.run()

Part One

Code - Part 1

defmodule PartOne do
  def solve(input) do
    IO.puts("--- Part One ---")
    IO.puts("Result: #{run(input)}")
  end

  def run(input) do
    input
    |> String.split("\n")
    |> Enum.map(&Parser.parse/1)
    |> Enum.sum()
  end
end

Tests - Part 1

ExUnit.start(autorun: false)

defmodule PartOneTest do
  use ExUnit.Case, async: true
  import PartOne

  @input "1abc2
pqr3stu8vwx
a1b2c3d4e5f
treb7uchet"
  @expected 142

  test "part one" do
    actual = run(@input)
    assert actual == @expected
  end
end

ExUnit.run()

Solution - Part 1

PartOne.solve(puzzle_input)

Part Two

Code - Part 2

defmodule PartTwo do
  def solve(input) do
    IO.puts("--- Part Two ---")
    IO.puts("Result: #{run(input)}")

    run(input)
  end

  def run(input) do
    input
    |> String.split("\n")
    |> Enum.map(&Parser.parse2/1)
    |> Enum.sum()
  end
end

Tests - Part 2

ExUnit.start(autorun: false)

defmodule PartTwoTest do
  use ExUnit.Case, async: true
  import PartTwo

  @input "two1nine
eightwothree
abcone2threexyz
xtwone3four
4nineeightseven2
zoneight234
7pqrstsixteen"
  @expected 281

  test "part two" do
    actual = run(@input)
    assert actual == @expected
  end
end

ExUnit.run()

Solution - Part 2

PartTwo.solve(puzzle_input)