Skip to content

Commit ea675dc

Browse files
committed
2024 Day 01 part 1 & 2
- Updates to dependencies. - Add PHP 8.4 to test matrix.
1 parent 71030e3 commit ea675dc

10 files changed

+1755
-550
lines changed

.github/workflows/tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
matrix:
1515
php: [ 8.1, 8.2, 8.3 ]
1616
os: [ ubuntu-latest ]
17-
year: [ 2015, 2018, 2019, 2020, 2021, 2022, 2023 ]
17+
year: [ 2015, 2018, 2019, 2020, 2021, 2022, 2023, 2024 ]
1818

1919
name: PHP ${{ matrix.php }} - Unit Tests for Year ${{ matrix.year }}
2020

2024/day-01.php

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
<?php
2+
3+
require __DIR__ . '/../vendor/autoload.php';
4+
5+
use adventofcode\Year2024\ShortestDistanceParser;
6+
7+
/**
8+
* --- Day 1: Historian Hysteria ---
9+
*
10+
* The Chief Historian is always present for the big Christmas sleigh launch, but nobody has seen him in months! Last
11+
* anyone heard, he was visiting locations that are historically significant to the North Pole; a group of Senior
12+
* Historians has asked you to accompany them as they check the places they think he was most likely to visit.
13+
*
14+
* As each location is checked, they will mark it on their list with a star. They figure the Chief Historian must be in
15+
* one of the first fifty places they'll look, so in order to save Christmas, you need to help them get fifty stars on
16+
* their list before Santa takes off on December 25th.
17+
*
18+
* Collect stars by solving puzzles. Two puzzles will be made available on each day in the Advent calendar; the second
19+
* puzzle is unlocked when you complete the first. Each puzzle grants one star. Good luck!
20+
*
21+
* You haven't even left yet and the group of Elvish Senior Historians has already hit a problem: their list of
22+
* locations to check is currently empty. Eventually, someone decides that the best place to check first would be the
23+
* Chief Historian's office.
24+
*
25+
* Upon pouring into the office, everyone confirms that the Chief Historian is indeed nowhere to be found. Instead, the
26+
* Elves discover an assortment of notes and lists of historically significant locations! This seems to be the planning
27+
* the Chief Historian was doing before he left. Perhaps these notes can be used to determine which locations to search?
28+
*
29+
* Throughout the Chief's office, the historically significant locations are listed not by name but by a unique number
30+
* called the location ID. To make sure they don't miss anything, The Historians split into two groups, each searching
31+
* the office and trying to create their own complete list of location IDs.
32+
*
33+
* There's just one problem: by holding the two lists up side by side (your puzzle input), it quickly becomes clear that
34+
* the lists aren't very similar. Maybe you can help The Historians reconcile their lists?
35+
*
36+
* For example:
37+
*
38+
* 3 4
39+
* 4 3
40+
* 2 5
41+
* 1 3
42+
* 3 9
43+
* 3 3
44+
*
45+
* Maybe the lists are only off by a small amount! To find out, pair up the numbers and measure how far apart they are.
46+
* Pair up the smallest number in the left list with the smallest number in the right list, then the second-smallest
47+
* left number with the second-smallest right number, and so on.
48+
*
49+
* Within each pair, figure out how far apart the two numbers are; you'll need to add up all of those distances. For
50+
* 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
51+
* up a 9 with a 3, the distance apart is 6.
52+
*
53+
* In the example list above, the pairs and distances would be as follows:
54+
*
55+
* - The smallest number in the left list is 1, and the smallest number in the right list is 3.
56+
* The distance between them is 2.
57+
* - The second-smallest number in the left list is 2, and the second-smallest number in the right list is another 3.
58+
* The distance between them is 1.
59+
* - The third-smallest number in both lists is 3, so the distance between them is 0.
60+
* - The next numbers to pair up are 3 and 4, a distance of 1.
61+
* - The fifth-smallest numbers in each list are 3 and 5, a distance of 2.
62+
* - Finally, the largest number in the left list is 4, while the largest number in the right list is 9;
63+
* these are a distance 5 apart.
64+
*
65+
* To find the total distance between the left list and the right list, add up the distances between all of the pairs
66+
* you found. In the example above, this is 2 + 1 + 0 + 1 + 2 + 5, a total distance of 11!
67+
*
68+
* Your actual left and right lists contain many location IDs. What is the total distance between your lists?
69+
*/
70+
71+
$shortestDistanceParser = new ShortestDistanceParser();
72+
73+
$listValues = file(__DIR__ . '/inputs/day-01.input', FILE_IGNORE_NEW_LINES);
74+
75+
$sum = $shortestDistanceParser->findShortestDistanceSum($listValues);
76+
print('The sum of the shortest distances values based on the supplied lists is ' . $sum . ".\n");
77+
78+
/**
79+
* --- Part Two ---
80+
*
81+
* Your analysis only confirmed what everyone feared: the two lists of location IDs are indeed very different.
82+
*
83+
* Or are they?
84+
*
85+
* The Historians can't agree on which group made the mistakes or how to read most of the Chief's handwriting, but in
86+
* the commotion you notice an interesting detail: a lot of location IDs appear in both lists! Maybe the other numbers
87+
* aren't location IDs at all but rather misinterpreted handwriting.
88+
*
89+
* This time, you'll need to figure out exactly how often each number from the left list appears in the right list.
90+
* Calculate a total similarity score by adding up each number in the left list after multiplying it by the number of
91+
* times that number appears in the right list.
92+
*
93+
* Here are the same example lists again:
94+
*
95+
* 3 4
96+
* 4 3
97+
* 2 5
98+
* 1 3
99+
* 3 9
100+
* 3 3
101+
*
102+
* For these example lists, here is the process of finding the similarity score:
103+
*
104+
* - The first number in the left list is 3. It appears in the right list three times,
105+
* so the similarity score increases by 3 * 3 = 9.
106+
* - The second number in the left list is 4. It appears in the right list once,
107+
* so the similarity score increases by 4 * 1 = 4.
108+
* - The third number in the left list is 2. It does not appear in the right list,
109+
* so the similarity score does not increase (2 * 0 = 0).
110+
* - The fourth number, 1, also does not appear in the right list.
111+
* - The fifth number, 3, appears in the right list three times; the similarity score increases by 9.
112+
* - The last number, 3, appears in the right list three times; the similarity score again increases by 9.
113+
*
114+
* So, for these example lists, the similarity score at the end of this process is 31 (9 + 4 + 0 + 0 + 9 + 9).
115+
*
116+
* Once again consider your left and right lists. What is their similarity score?
117+
*/
118+
119+
$sum = $shortestDistanceParser->findSimilarityScoreSum($listValues);
120+
print('The sum of the similarity scores based on the supplied lists is ' . $sum . ".\n");

2024/inputs/day-01-sample.input

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
3 4
2+
4 3
3+
2 5
4+
1 3
5+
3 9
6+
3 3

0 commit comments

Comments
 (0)