diff --git a/lib/advent_code2024.ex b/lib/advent_code2024.ex index c9a23ce..65bbedb 100644 --- a/lib/advent_code2024.ex +++ b/lib/advent_code2024.ex @@ -4,5 +4,8 @@ defmodule AdventCode2024 do """ defdelegate solve_day1(input_file \\ "day1/input.txt"), to: AdventCode2024.Day1, as: :solve - defdelegate solve_day1_part2(input_file \\ "day1/input.txt"), to: AdventCode2024.Day1, as: :solve_part2 + + defdelegate solve_day1_part2(input_file \\ "day1/input.txt"), + to: AdventCode2024.Day1, + as: :solve_part2 end diff --git a/lib/advent_code2024/day1.ex b/lib/advent_code2024/day1.ex index 54881a4..9e2bb0e 100644 --- a/lib/advent_code2024/day1.ex +++ b/lib/advent_code2024/day1.ex @@ -6,20 +6,24 @@ defmodule AdventCode2024.Day1 do def solve(input_file \\ "day1/input.txt") do case File.read(input_file) do {:ok, content} -> - {left_list, right_list} = parse_input(content) - result = calculate_total_distance(left_list, right_list) + {left, right} = parse_input(content) + result = calculate_total_distance(left, right) {:ok, result} - {:error, reason} -> {:error, reason} + + {:error, reason} -> + {:error, reason} end end def solve_part2(input_file \\ "day1/input.txt") do case File.read(input_file) do {:ok, content} -> - {left_list, right_list} = parse_input(content) - result = calculate_similarity_score(left_list, right_list) + {left, right} = parse_input(content) + result = calculate_similarity_score(left, right) {:ok, result} - {:error, reason} -> {:error, reason} + + {:error, reason} -> + {:error, reason} end end @@ -28,7 +32,7 @@ defmodule AdventCode2024.Day1 do content |> String.split("\n", trim: true) |> Enum.map(&String.split(&1, ~r/\s+/, trim: true)) - |> Enum.map(fn [left, right] -> + |> Enum.map(fn [left, right] -> {String.to_integer(left), String.to_integer(right)} end) |> Enum.unzip() @@ -36,17 +40,17 @@ defmodule AdventCode2024.Day1 do {left, right} end - defp calculate_total_distance(left_list, right_list) do - Enum.zip(Enum.sort(left_list), Enum.sort(right_list)) + defp calculate_total_distance(left, right) do + Enum.zip(Enum.sort(left), Enum.sort(right)) |> Enum.map(fn {a, b} -> abs(a - b) end) |> Enum.sum() end - defp calculate_similarity_score(left_list, right_list) do - frequencies = Enum.frequencies(right_list) - - left_list - |> Enum.map(fn num -> + defp calculate_similarity_score(left, right) do + frequencies = Enum.frequencies(right) + + left + |> Enum.map(fn num -> num * Map.get(frequencies, num, 0) end) |> Enum.sum() diff --git a/test/advent_code2024_test.exs b/test/advent_code2024_test.exs index e9f2134..9b9e17a 100644 --- a/test/advent_code2024_test.exs +++ b/test/advent_code2024_test.exs @@ -12,11 +12,9 @@ defmodule AdventCode2024Test do test "handles missing input file" do assert {:error, :enoent} = AdventCode2024.solve_day1("nonexistent.txt") end - end describe "Day 1 Part 2: Similarity Score" do - test "solves day 1 part 2 puzzle with actual input file" do assert {:ok, result} = AdventCode2024.solve_day1_part2() assert is_integer(result)