Created
December 6, 2023 16:22
-
-
Save manewitz/9e80b51da99ab1981744dd1bbe432a0b to your computer and use it in GitHub Desktop.
Advent of Code 2023 - Day 1, V2 - Elixir
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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