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)