Advent Of Code 2021:第 3 天第 1 部分 | PYTHON 中未添加到变量的字符

Advent Of Code 2021: Day 3 Part 1 | characters not added to variable in PYTHON

这是我的代码,我的输出甚至看起来都不正确,我认为 0 和 1 没有连接到变量。

#Day 3 Part 1
one_count = 0
zero_count = 0

gamma = ""
espilon = ""

with open('input3.txt') as f:
    data = f.read()
    nums = [str(num) for num in data.splitlines()]

nums = [list(i) for i in nums]
#print(nums)

for j in range(0, 12):

    for i in range(len(nums)):
        if "1" in nums[i][j]:
            one_count += 1

        elif "0" in nums[i][j]:
            zero_count += 1
        

if zero_count > one_count:
    gamma += "0"
    espilon += "1"

    zero_count = 0
    one_count = 0

elif one_count > zero_count:
    gamma += "1"
    espilon += "0"

    zero_count = 0
    one_count = 0

print(gamma)
print(espilon)

输出:

1
0

我认为我无法添加 1,000 行的 txt 文件,但您可以自己访问代码 2021 网站的出现并检查第 3 天第 1 部分的输入。

Advent of code Day 3

问题是你需要为每个位位置(或每一列)应用逻辑(计算零和一),而不是像你的代码那样只应用一次

最简单的方法是迭代列,使用zip从行转置,然后为每个找到最常见和最不常见的(一个与另一个相反)

puzzle = """00100\n11110\n10110\n10111\n10101\n01111\n00111\n11100\n10000\n11001\n00010\n01010"""

rows = puzzle.splitlines()  # ['00100', '11110', '10110', ..
cols = list(zip(*rows))  # [('0', '1', '1', '1', '1', '0', '0', '1', '1', '1', '0', '0'), ...
gamma = ""  # most common
epsilon = ""  # least common

for col in cols:
    if col.count('1') > col.count('0'):  # most common is 1
        gamma += '1'
        epsilon += '0'
    else:  # most common is 0
        gamma += '0'
        epsilon += '1'

gamma = int(gamma, 2)
epsilon = int(epsilon, 2)
power = gamma * epsilon

print(f"{gamma=} {epsilon=} {power=}")  # gamma=22 epsilon=9 power=198

也可以使用二进制数学

gamma = 0
epsilon = 0
l = len(cols)
for idx, col in enumerate(cols):
    if col.count('1') > col.count('0'):
        gamma += 2 ** (l - idx - 1)
    else:
        epsilon += 2 ** (l - idx - 1)
power = gamma * epsilon