|
| 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"); |
0 commit comments