Skip to content

Instantly share code, notes, and snippets.

@manewitz
Created December 6, 2023 16:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save manewitz/9e80b51da99ab1981744dd1bbe432a0b to your computer and use it in GitHub Desktop.
Save manewitz/9e80b51da99ab1981744dd1bbe432a0b to your computer and use it in GitHub Desktop.
Advent of Code 2023 - Day 1, V2 - Elixir
defmodule AdventOfCode23.Dec01.V2 do
@number_map %{
"zero" => 0,
"one" => 1,
"two" => 2,
"three" => 3,
"four" => 4,
"five" => 5,
"six" => 6,
"seven" => 7,
"eight" => 8,
"nine" => 9
}
@number_strings [
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9"
]
@spec add_inputs(binary()) :: number()
def add_inputs(filename) do
content = File.read!(Path.expand(filename))
String.split(content, "\n", trim: true)
|> Enum.map(fn row ->
to_list_of_digits(row)
|> first_last()
|> String.to_integer()
end)
|> Enum.sum()
end
@doc """
iterate through the number patterns, get each match,
sort them by index, then parse from string to integer
"""
@spec to_list_of_digits(binary()) :: list()
def to_list_of_digits(str) do
@number_strings
|> Enum.flat_map(fn pattern ->
Regex.scan(Regex.compile!(pattern), str, return: :index, trim: true)
|> Enum.map(fn [{start_pos, _}] -> {start_pos, pattern} end)
end)
|> Enum.sort()
|> Enum.map(fn {_, pattern} -> pattern end)
|> Enum.map(&parse_element/1)
end
defp parse_element(element) do
case Integer.parse(element) do
{number, _} -> number
:error -> Map.get(@number_map, element)
end
end
defp first_last(row), do: [hd(row), List.last(row)] |> Enum.join()
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment