Skip to content

Commit 3be0ec6

Browse files
authored
Year 2021 Day 03 solutions (#9)
- Solve both parts of day 3.
1 parent 68fa01b commit 3be0ec6

File tree

6 files changed

+1315
-0
lines changed

6 files changed

+1315
-0
lines changed

2021/day-03.php

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
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+
);

2021/inputs/day-03-sample.input

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
00100
2+
11110
3+
10110
4+
10111
5+
10101
6+
01111
7+
00111
8+
11100
9+
10000
10+
11001
11+
00010
12+
01010

0 commit comments

Comments
 (0)