diff --git a/lib/day1.ex b/lib/day1.ex index 5b9a9f9..4df5025 100644 --- a/lib/day1.ex +++ b/lib/day1.ex @@ -2,14 +2,48 @@ defmodule Aoc2023.Day1 do use Aoc2023 def parse(input) do - input + fn (replacement) -> + input + |> String.split("\n") + |> Enum.map(replacement) + |> Enum.map(fn (line) -> + line + |> String.to_charlist() + |> Enum.filter(&(?0 <= &1 && &1 <= ?9)) + |> Enum.map(&(&1 - ?0)) + end) + |> Enum.map(&[List.first(&1), List.last(&1)]) + |> Enum.filter(fn (l) -> Enum.all?(l, &(&1 != nil)) end) + |> Enum.map(&Integer.undigits/1) + |> Enum.sum + end end def part1(input) do - nil + input.(fn line -> line end) end - def part2(input) do - nil + @numbers [ + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + ] + + defp replacements(line) do + line + |> String.replace(@numbers, fn (n) -> Integer.to_string(Enum.find_index(@numbers, &(&1 == n)) + 1) <> String.slice(n, 1..String.length(n)) end) end + + defp replacements_rec(line) do + if replacements(line) == line, do: line, else: replacements_rec(replacements(line)) + end + def part2(input) do + input.(&replacements_rec/1) + end end diff --git a/tests/day1/1 b/tests/day1/1 new file mode 100644 index 0000000..7bbc69a --- /dev/null +++ b/tests/day1/1 @@ -0,0 +1,4 @@ +1abc2 +pqr3stu8vwx +a1b2c3d4e5f +treb7uchet diff --git a/tests/day1/1.1 b/tests/day1/1.1 new file mode 100644 index 0000000..aaacbe6 --- /dev/null +++ b/tests/day1/1.1 @@ -0,0 +1 @@ +142 diff --git a/tests/day1/1.2 b/tests/day1/1.2 new file mode 100644 index 0000000..aaacbe6 --- /dev/null +++ b/tests/day1/1.2 @@ -0,0 +1 @@ +142 diff --git a/tests/day1/2 b/tests/day1/2 new file mode 100644 index 0000000..41aa89c --- /dev/null +++ b/tests/day1/2 @@ -0,0 +1,7 @@ +two1nine +eightwothree +abcone2threexyz +xtwone3four +4nineeightseven2 +zoneight234 +7pqrstsixteen diff --git a/tests/day1/2.1 b/tests/day1/2.1 new file mode 100644 index 0000000..7fba2b4 --- /dev/null +++ b/tests/day1/2.1 @@ -0,0 +1 @@ +209 diff --git a/tests/day1/2.2 b/tests/day1/2.2 new file mode 100644 index 0000000..1473a88 --- /dev/null +++ b/tests/day1/2.2 @@ -0,0 +1 @@ +281