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