feat: Reorganize project structure for Day 1 solution

This commit:
- Moves input files to priv/inputs/day1/
- Creates solutions directory in lib/advent_code2024/solutions/
- Adds README.md with problem description
- Updates module and import paths
- Removes old directory structure
This commit is contained in:
Ruidy (aider) 2024-12-01 18:09:01 +01:00 committed by Ruidy
parent c1fc39ac17
commit ac7eea0f9b
No known key found for this signature in database
GPG key ID: E00F51288CB857CC
7 changed files with 43 additions and 161 deletions

View file

@ -1,74 +0,0 @@
# Day 1: Historian Hysteria
The _Chief Historian_ is always present for the big Christmas sleigh launch, but nobody has seen him in months! Last anyone heard, he was visiting locations that are historically significant to the North Pole; a group of Senior Historians has asked you to accompany them as they check the places they think he was most likely to visit.
As each location is checked, they will mark it on their list with a _star_. They figure the Chief Historian _must_ be in one of the first fifty places they'll look, so in order to save Christmas, you need to help them get _fifty stars_ on their list before Santa takes off on December 25th.
Collect stars by solving puzzles. Two puzzles will be made available on each day in the Advent calendar; the second puzzle is unlocked when you complete the first. Each puzzle grants _one star_. Good luck!
You haven't even left yet and the group of Elvish Senior Historians has already hit a problem: their list of locations to check is currently _empty_. Eventually, someone decides that the best place to check first would be the Chief Historian's office.
Upon pouring into the office, everyone confirms that the Chief Historian is indeed nowhere to be found. Instead, the Elves discover an assortment of notes and lists of historically significant locations! This seems to be the planning the Chief Historian was doing before he left. Perhaps these notes can be used to determine which locations to search?
Throughout the Chief's office, the historically significant locations are listed not by name but by a unique number called the _location ID_. To make sure they don't miss anything, The Historians split into two groups, each searching the office and trying to create their own complete list of location IDs.
There's just one problem: by holding the two lists up _side by side_ (your puzzle input), it quickly becomes clear that the lists aren't very similar. Maybe you can help The Historians reconcile their lists?
For example:
3 4
4 3
2 5
1 3
3 9
3 3
Maybe the lists are only off by a small amount! To find out, pair up the numbers and measure how far apart they are. Pair up the _smallest number in the left list_ with the _smallest number in the right list_, then the _second-smallest left number_ with the _second-smallest right number_, and so on.
Within each pair, figure out _how far apart_ the two numbers are; you'll need to _add up all of those distances_. For example, if you pair up a `3` from the left list with a `7` from the right list, the distance apart is `4`; if you pair up a `9` with a `3`, the distance apart is `6`.
In the example list above, the pairs and distances would be as follows:
- The smallest number in the left list is `1`, and the smallest number in the right list is `3`. The distance between them is _`2`_.
- The second-smallest number in the left list is `2`, and the second-smallest number in the right list is another `3`. The distance between them is _`1`_.
- The third-smallest number in both lists is `3`, so the distance between them is _`0`_.
- The next numbers to pair up are `3` and `4`, a distance of _`1`_.
- The fifth-smallest numbers in each list are `3` and `5`, a distance of _`2`_.
- Finally, the largest number in the left list is `4`, while the largest number in the right list is `9`; these are a distance _`5`_ apart.
To find the _total distance_ between the left list and the right list, add up the distances between all of the pairs you found. In the example above, this is `2 + 1 + 0 + 1 + 2 + 5`, a total distance of _`11`_!
Your actual left and right lists contain many location IDs. _What is the total distance between your lists?_
## Part Two
Your analysis only confirmed what everyone feared: the two lists of location IDs are indeed very different.
Or are they?
The Historians can't agree on which group made the mistakes or how to read most of the Chief's handwriting, but in the commotion you notice an interesting detail: a lot of location IDs appear in both lists! Maybe the other numbers aren't location IDs at all but rather misinterpreted handwriting.
This time, you'll need to figure out exactly how often each number from the left list appears in the right list. Calculate a total similarity score by adding up each number in the left list after multiplying it by the number of times that number appears in the right list.
Here are the same example lists again:
3 4
4 3
2 5
1 3
3 9
3 3
For these example lists, here is the process of finding the similarity score:
The first number in the left list is 3. It appears in the right list three times, so the similarity score increases by 3 _3 = 9.
The second number in the left list is 4. It appears in the right list once, so the similarity score increases by 4_ 1 = 4.
The third number in the left list is 2. It does not appear in the right list, so the similarity score does not increase (2 \* 0 = 0).
The fourth number, 1, also does not appear in the right list.
The fifth number, 3, appears in the right list three times; the similarity score increases by 9.
The last number, 3, appears in the right list three times; the similarity score again increases by 9.
So, for these example lists, the similarity score at the end of this process is 31 (9 + 4 + 0 + 0 + 9 + 9).
Once again consider your left and right lists. What is their similarity score?
Although it hasn't changed, you can still get your puzzle input.

View file

@ -1,77 +0,0 @@
Advent of Code[About][Events][Shop][Settings][Log Out]Ruidy 1\*
var y=2024;[Calendar][AoC++][Sponsors][Leaderboard][Stats]
Our sponsors help make Advent of Code possible:
Jane Street - We're a research-driven trading firm where curious people work together to solve the puzzle of global markets. Will our next great idea come from you? Our largest offices are in NYC, London, Hong Kong, and Singapore.
--- Day 1: Historian Hysteria ---
The Chief Historian is always present for the big Christmas sleigh launch, but nobody has seen him in months! Last anyone heard, he was visiting locations that are historically significant to the North Pole; a group of Senior Historians has asked you to accompany them as they check the places they think he was most likely to visit.
As each location is checked, they will mark it on their list with a star. They figure the Chief Historian must be in one of the first fifty places they'll look, so in order to save Christmas, you need to help them get fifty stars on their list before Santa takes off on December 25th.
Collect stars by solving puzzles. Two puzzles will be made available on each day in the Advent calendar; the second puzzle is unlocked when you complete the first. Each puzzle grants one star. Good luck!
You haven't even left yet and the group of Elvish Senior Historians has already hit a problem: their list of locations to check is currently empty. Eventually, someone decides that the best place to check first would be the Chief Historian's office.
Upon pouring into the office, everyone confirms that the Chief Historian is indeed nowhere to be found. Instead, the Elves discover an assortment of notes and lists of historically significant locations! This seems to be the planning the Chief Historian was doing before he left. Perhaps these notes can be used to determine which locations to search?
Throughout the Chief's office, the historically significant locations are listed not by name but by a unique number called the location ID. To make sure they don't miss anything, The Historians split into two groups, each searching the office and trying to create their own complete list of location IDs.
There's just one problem: by holding the two lists up side by side (your puzzle input), it quickly becomes clear that the lists aren't very similar. Maybe you can help The Historians reconcile their lists?
For example:
3 4
4 3
2 5
1 3
3 9
3 3
Maybe the lists are only off by a small amount! To find out, pair up the numbers and measure how far apart they are. Pair up the smallest number in the left list with the smallest number in the right list, then the second-smallest left number with the second-smallest right number, and so on.
Within each pair, figure out how far apart the two numbers are; you'll need to add up all of those distances. For example, if you pair up a 3 from the left list with a 7 from the right list, the distance apart is 4; if you pair up a 9 with a 3, the distance apart is 6.
In the example list above, the pairs and distances would be as follows:
The smallest number in the left list is 1, and the smallest number in the right list is 3. The distance between them is 2.
The second-smallest number in the left list is 2, and the second-smallest number in the right list is another 3. The distance between them is 1.
The third-smallest number in both lists is 3, so the distance between them is 0.
The next numbers to pair up are 3 and 4, a distance of 1.
The fifth-smallest numbers in each list are 3 and 5, a distance of 2.
Finally, the largest number in the left list is 4, while the largest number in the right list is 9; these are a distance 5 apart.
To find the total distance between the left list and the right list, add up the distances between all of the pairs you found. In the example above, this is 2 + 1 + 0 + 1 + 2 + 5, a total distance of 11!
Your actual left and right lists contain many location IDs. What is the total distance between your lists?
Your puzzle answer was 1651298.
The first half of this puzzle is complete! It provides one gold star: \*
--- Part Two ---
Your analysis only confirmed what everyone feared: the two lists of location IDs are indeed very different.
Or are they?
The Historians can't agree on which group made the mistakes or how to read most of the Chief's handwriting, but in the commotion you notice an interesting detail: a lot of location IDs appear in both lists! Maybe the other numbers aren't location IDs at all but rather misinterpreted handwriting.
This time, you'll need to figure out exactly how often each number from the left list appears in the right list. Calculate a total similarity score by adding up each number in the left list after multiplying it by the number of times that number appears in the right list.
Here are the same example lists again:
3 4
4 3
2 5
1 3
3 9
3 3
For these example lists, here is the process of finding the similarity score:
The first number in the left list is 3. It appears in the right list three times, so the similarity score increases by 3 _3 = 9.
The second number in the left list is 4. It appears in the right list once, so the similarity score increases by 4_ 1 = 4.
The third number in the left list is 2. It does not appear in the right list, so the similarity score does not increase (2 \* 0 = 0).
The fourth number, 1, also does not appear in the right list.
The fifth number, 3, appears in the right list three times; the similarity score increases by 9.
The last number, 3, appears in the right list three times; the similarity score again increases by 9.
So, for these example lists, the similarity score at the end of this process is 31 (9 + 4 + 0 + 0 + 9 + 9).
Once again consider your left and right lists. What is their similarity score?
Although it hasn't changed, you can still get your puzzle input.

View file

@ -3,9 +3,11 @@ defmodule AdventCode2024 do
Documentation for `AdventCode2024`.
"""
defdelegate solve_day1(input_file \\ "day1/input.txt"), to: AdventCode2024.Day1, as: :solve
defdelegate solve_day1(input_file \\ "priv/inputs/day1/input.txt"),
to: AdventCode2024.Solutions.Day1,
as: :solve
defdelegate solve_day1_part2(input_file \\ "day1/input.txt"),
to: AdventCode2024.Day1,
defdelegate solve_day1_part2(input_file \\ "priv/inputs/day1/input.txt"),
to: AdventCode2024.Solutions.Day1,
as: :solve_part2
end

View file

@ -5,7 +5,7 @@ defmodule AdventCode2024.Solution do
@doc """
Solves Part 1 of a daily challenge.
## Parameters
- input_file: Path to input file
@ -17,7 +17,7 @@ defmodule AdventCode2024.Solution do
@doc """
Solves Part 2 of a daily challenge.
## Parameters
- input_file: Path to input file

View file

@ -0,0 +1,29 @@
# Day 1: Historian Hysteria
## Part 1: Distance Calculation
Given pairs of numbers, calculate the total distance between sorted pairs.
### Input Format
Each line contains two space-separated integers.
Example:
```
39687 54930
86219 31559
48536 73145
```
### Algorithm
1. Sort both sequences of numbers
2. Calculate absolute differences between paired numbers
3. Sum all differences
## Part 2: Similarity Score
Calculate similarity scores based on frequency matching between number sequences.
### Algorithm
1. Calculate frequency of numbers in right sequence
2. For each number in left sequence, multiply by its frequency in right sequence
3. Sum all products

View file

@ -1,4 +1,4 @@
defmodule AdventCode2024.Day1 do
defmodule AdventCode2024.Solutions.Day1 do
@behaviour AdventCode2024.Solution
@moduledoc """
Solution for Advent of Code 2024 - Day 1: Historian Hysteria
@ -10,6 +10,8 @@ defmodule AdventCode2024.Day1 do
Input file format expects lines with two space-separated integers.
"""
@default_input "priv/inputs/day1/input.txt"
@type result :: {:ok, integer()} | {:error, String.t()}
@type number_pair :: {[integer()], [integer()]}
@ -19,14 +21,14 @@ defmodule AdventCode2024.Day1 do
Takes an input file path and calculates the total distance between paired numbers.
## Parameters
- input_file: Path to input file (defaults to "day1/input.txt")
- input_file: Path to input file (defaults to "priv/inputs/day1/input.txt")
## Returns
- `{:ok, result}` where result is the calculated total distance
- `{:error, reason}` if file reading fails
"""
@spec solve(String.t()) :: result()
def solve(input_file \\ "day1/input.txt") do
def solve(input_file \\ @default_input) do
case File.read(input_file) do
{:ok, content} ->
case parse_input(content) do
@ -53,14 +55,14 @@ defmodule AdventCode2024.Day1 do
Takes an input file path and calculates similarity scores based on number frequencies.
## Parameters
- input_file: Path to input file (defaults to "day1/input.txt")
- input_file: Path to input file (defaults to "priv/inputs/day1/input.txt")
## Returns
- `{:ok, result}` where result is the similarity score
- `{:error, reason}` if file reading fails
"""
@spec solve_part2(String.t()) :: result()
def solve_part2(input_file \\ "day1/input.txt") do
def solve_part2(input_file \\ @default_input) do
case File.read(input_file) do
{:ok, content} ->
case parse_input(content) do