Solution to problem 3 part 1 in Python
This commit is contained in:
parent
913284fded
commit
131cd14b16
91
src/Year_2021/P3.py
Normal file
91
src/Year_2021/P3.py
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
# --- Day 3: Binary Diagnostic ---
|
||||||
|
|
||||||
|
# The submarine has been making some odd creaking noises, so you ask it to
|
||||||
|
# produce a diagnostic report just in case.
|
||||||
|
|
||||||
|
# The diagnostic report (your puzzle input) consists of a list of binary
|
||||||
|
# numbers which, when decoded properly, can tell you many useful things about
|
||||||
|
# the conditions of the submarine. The first parameter to check is the power
|
||||||
|
# consumption.
|
||||||
|
|
||||||
|
# You need to use the binary numbers in the diagnostic report to generate two
|
||||||
|
# new binary numbers (called the gamma rate and the epsilon rate). The power
|
||||||
|
# consumption can then be found by multiplying the gamma rate by the epsilon
|
||||||
|
# rate.
|
||||||
|
|
||||||
|
# Each bit in the gamma rate can be determined by finding the most common bit
|
||||||
|
# in the corresponding position of all numbers in the diagnostic report. For
|
||||||
|
# example, given the following diagnostic report:
|
||||||
|
|
||||||
|
# 00100
|
||||||
|
# 11110
|
||||||
|
# 10110
|
||||||
|
# 10111
|
||||||
|
# 10101
|
||||||
|
# 01111
|
||||||
|
# 00111
|
||||||
|
# 11100
|
||||||
|
# 10000
|
||||||
|
# 11001
|
||||||
|
# 00010
|
||||||
|
# 01010
|
||||||
|
|
||||||
|
# Considering only the first bit of each number, there are five 0 bits and
|
||||||
|
# seven 1 bits. Since the most common bit is 1, the first bit of the gamma rate
|
||||||
|
# is 1.
|
||||||
|
|
||||||
|
# The most common second bit of the numbers in the diagnostic report is 0, so
|
||||||
|
# the second bit of the gamma rate is 0.
|
||||||
|
|
||||||
|
# The most common value of the third, fourth, and fifth bits are 1, 1, and 0,
|
||||||
|
# respectively, and so the final three bits of the gamma rate are 110.
|
||||||
|
|
||||||
|
# So, the gamma rate is the binary number 10110, or 22 in decimal.
|
||||||
|
|
||||||
|
# The epsilon rate is calculated in a similar way; rather than use the most
|
||||||
|
# common bit, the least common bit from each position is used. So, the epsilon
|
||||||
|
# rate is 01001, or 9 in decimal. Multiplying the gamma rate (22) by the
|
||||||
|
# epsilon rate (9) produces the power consumption, 198.
|
||||||
|
|
||||||
|
# Use the binary numbers in your diagnostic report to calculate the gamma rate
|
||||||
|
# and epsilon rate, then multiply them together. What is the power consumption
|
||||||
|
# of the submarine? (Be sure to represent your answer in decimal, not binary.)
|
||||||
|
|
||||||
|
from collections import Counter
|
||||||
|
|
||||||
|
with open("files/P3.txt", "r") as f:
|
||||||
|
diagnostics = [number for number in f.read().strip().split()]
|
||||||
|
|
||||||
|
|
||||||
|
def part_1() -> None:
|
||||||
|
# holding each bit in a different key
|
||||||
|
bits_dic = {}
|
||||||
|
for i in range(12):
|
||||||
|
bits_dic[i] = []
|
||||||
|
|
||||||
|
[
|
||||||
|
bits_dic[idx].append(val)
|
||||||
|
for number in diagnostics
|
||||||
|
for idx, val in enumerate(number)
|
||||||
|
]
|
||||||
|
|
||||||
|
# get bit number, and ocurrences of zeros and ones
|
||||||
|
res = [(k, Counter(v).most_common()) for k, v in bits_dic.items()]
|
||||||
|
|
||||||
|
gamma_bin_str = [
|
||||||
|
mcb[0] if mcb[1] > lcb[1] else lcb[0] if mcb[1] < lcb[1] else None
|
||||||
|
for k, (mcb, lcb) in res
|
||||||
|
]
|
||||||
|
epsilon_bin_str = [
|
||||||
|
lcb[0] if mcb[1] > lcb[1] else mcb[0] if mcb[1] < lcb[1] else None
|
||||||
|
for k, (mcb, lcb) in res
|
||||||
|
]
|
||||||
|
|
||||||
|
gamma = int("".join(gamma_bin_str), 2)
|
||||||
|
epsilon = int("".join(epsilon_bin_str), 2)
|
||||||
|
|
||||||
|
print(f"Power consumption is {gamma*epsilon}")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
part_1()
|
1000
src/Year_2021/files/P3.txt
Normal file
1000
src/Year_2021/files/P3.txt
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user