|
| 1 | +<?php |
| 2 | + |
| 3 | +require __DIR__ . '/../vendor/autoload.php'; |
| 4 | + |
| 5 | +use adventofcode\Year2021\Diagnostics; |
| 6 | + |
| 7 | +/** |
| 8 | + * --- Day 3: Binary Diagnostic --- |
| 9 | + * The submarine has been making some odd creaking noises, so you ask it to produce a diagnostic report just in case. |
| 10 | + * |
| 11 | + * The diagnostic report (your puzzle input) consists of a list of binary numbers which, when decoded properly, can |
| 12 | + * tell you many useful things about the conditions of the submarine. The first parameter to check is the power |
| 13 | + * consumption. |
| 14 | + * |
| 15 | + * You need to use the binary numbers in the diagnostic report to generate two new binary numbers (called the gamma |
| 16 | + * rate and the epsilon rate). The power consumption can then be found by multiplying the gamma rate by the epsilon |
| 17 | + * rate. |
| 18 | + * |
| 19 | + * Each bit in the gamma rate can be determined by finding the most common bit in the corresponding position of all |
| 20 | + * numbers in the diagnostic report. For example, given the following diagnostic report: |
| 21 | + * |
| 22 | + * 00100 |
| 23 | + * 11110 |
| 24 | + * 10110 |
| 25 | + * 10111 |
| 26 | + * 10101 |
| 27 | + * 01111 |
| 28 | + * 00111 |
| 29 | + * 11100 |
| 30 | + * 10000 |
| 31 | + * 11001 |
| 32 | + * 00010 |
| 33 | + * 01010 |
| 34 | + * |
| 35 | + * Considering only the first bit of each number, there are five 0 bits and seven 1 bits. Since the most common bit |
| 36 | + * is 1, the first bit of the gamma rate is 1. |
| 37 | + * |
| 38 | + * The most common second bit of the numbers in the diagnostic report is 0, so the second bit of the gamma rate is 0. |
| 39 | + * |
| 40 | + * The most common value of the third, fourth, and fifth bits are 1, 1, and 0, respectively, and so the final three |
| 41 | + * bits of the gamma rate are 110. |
| 42 | + * |
| 43 | + * So, the gamma rate is the binary number 10110, or 22 in decimal. |
| 44 | + * |
| 45 | + * The epsilon rate is calculated in a similar way; rather than use the most common bit, the least common bit from each |
| 46 | + * position is used. So, the epsilon rate is 01001, or 9 in decimal. Multiplying the gamma rate (22) by the epsilon |
| 47 | + * rate (9) produces the power consumption, 198. |
| 48 | + * |
| 49 | + * Use the binary numbers in your diagnostic report to calculate the gamma rate and epsilon rate, then multiply them |
| 50 | + * together. What is the power consumption of the submarine? (Be sure to represent your answer in decimal, not binary.) |
| 51 | + */ |
| 52 | + |
| 53 | +$diagnostics = new Diagnostics(); |
| 54 | + |
| 55 | +$readings = file(__DIR__ . '/inputs/day-03.input', FILE_IGNORE_NEW_LINES); |
| 56 | +$powerConsumption = $diagnostics->findPowerConsumption($readings); |
| 57 | +$product = $powerConsumption['epsilon'] * $powerConsumption['gamma']; |
| 58 | +print( |
| 59 | + 'Your epsilon value is ' . $powerConsumption['epsilon'] . ' and your gamma value is ' |
| 60 | + . $powerConsumption['gamma'] . ' for a product of ' . $product . ".\n" |
| 61 | +); |
| 62 | + |
| 63 | +/** |
| 64 | + * --- Part Two --- |
| 65 | + * Next, you should verify the life support rating, which can be determined by multiplying the oxygen generator rating |
| 66 | + * by the CO2 scrubber rating. |
| 67 | + * |
| 68 | + * Both the oxygen generator rating and the CO2 scrubber rating are values that can be found in your diagnostic |
| 69 | + * report - finding them is the tricky part. Both values are located using a similar process that involves filtering |
| 70 | + * out values until only one remains. Before searching for either rating value, start with the full list of binary |
| 71 | + * numbers from your diagnostic report and consider just the first bit of those numbers. Then: |
| 72 | + * |
| 73 | + * - Keep only numbers selected by the bit criteria for the type of rating value for which you are searching. Discard |
| 74 | + * numbers which do not match the bit criteria. |
| 75 | + * - If you only have one number left, stop; this is the rating value for which you are searching. |
| 76 | + * - Otherwise, repeat the process, considering the next bit to the right. |
| 77 | + * |
| 78 | + * The bit criteria depends on which type of rating value you want to find: |
| 79 | + * |
| 80 | + * - To find oxygen generator rating, determine the most common value (0 or 1) in the current bit position, and keep |
| 81 | + * only numbers with that bit in that position. If 0 and 1 are equally common, keep values with a 1 in the position |
| 82 | + * being considered. |
| 83 | + * - To find CO2 scrubber rating, determine the least common value (0 or 1) in the current bit position, and keep only |
| 84 | + * numbers with that bit in that position. If 0 and 1 are equally common, keep values with a 0 in the position being |
| 85 | + * considered. |
| 86 | + * |
| 87 | + * For example, to determine the oxygen generator rating value using the same example diagnostic report from above: |
| 88 | + * |
| 89 | + * - Start with all 12 numbers and consider only the first bit of each number. There are more 1 bits (7) than 0 |
| 90 | + * bits (5), so keep only the 7 numbers with a 1 in the first position: 11110, 10110, 10111, 10101, 11100, 10000, |
| 91 | + * and 11001. |
| 92 | + * - Then, consider the second bit of the 7 remaining numbers: there are more 0 bits (4) than 1 bits (3), so keep only |
| 93 | + * the 4 numbers with a 0 in the second position: 10110, 10111, 10101, and 10000. |
| 94 | + * - In the third position, three of the four numbers have a 1, so keep those three: 10110, 10111, and 10101. |
| 95 | + * - In the fourth position, two of the three numbers have a 1, so keep those two: 10110 and 10111. |
| 96 | + * - In the fifth position, there are an equal number of 0 bits and 1 bits (one each). So, to find the oxygen generator |
| 97 | + * rating, keep the number with a 1 in that position: 10111. |
| 98 | + * - As there is only one number left, stop; the oxygen generator rating is 10111, or 23 in decimal. |
| 99 | + * |
| 100 | + * Then, to determine the CO2 scrubber rating value from the same example above: |
| 101 | + * |
| 102 | + * - Start again with all 12 numbers and consider only the first bit of each number. There are fewer 0 bits (5) than 1 |
| 103 | + * bits (7), so keep only the 5 numbers with a 0 in the first position: 00100, 01111, 00111, 00010, and 01010. |
| 104 | + * - Then, consider the second bit of the 5 remaining numbers: there are fewer 1 bits (2) than 0 bits (3), so keep only |
| 105 | + * the 2 numbers with a 1 in the second position: 01111 and 01010. |
| 106 | + * - In the third position, there are an equal number of 0 bits and 1 bits (one each). So, to find the CO2 scrubber |
| 107 | + * rating, keep the number with a 0 in that position: 01010. |
| 108 | + * - As there is only one number left, stop; the CO2 scrubber rating is 01010, or 10 in decimal. |
| 109 | + * |
| 110 | + * Finally, to find the life support rating, multiply the oxygen generator rating (23) by the CO2 scrubber |
| 111 | + * rating (10) to get 230. |
| 112 | + * |
| 113 | + * Use the binary numbers in your diagnostic report to calculate the oxygen generator rating and CO2 scrubber rating, |
| 114 | + * then multiply them together. What is the life support rating of the submarine? (Be sure to represent your answer |
| 115 | + * in decimal, not binary.) |
| 116 | + */ |
| 117 | + |
| 118 | +$lifeSupportRating = $diagnostics->findLifeSupportRating($readings); |
| 119 | +$product = $lifeSupportRating['oxygen generator'] * $lifeSupportRating['co2 scrubber']; |
| 120 | +print( |
| 121 | + 'Your oxygen generator rating is ' . $lifeSupportRating['oxygen generator'] . ' and your CO2 scrubber rating is ' |
| 122 | + . $lifeSupportRating['co2 scrubber'] . ' for a product of ' . $product . ".\n" |
| 123 | +); |
0 commit comments