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 部分的输入。
问题是你需要为每个位位置(或每一列)应用逻辑(计算零和一),而不是像你的代码那样只应用一次
最简单的方法是迭代列,使用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
这是我的代码,我的输出甚至看起来都不正确,我认为 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 部分的输入。
问题是你需要为每个位位置(或每一列)应用逻辑(计算零和一),而不是像你的代码那样只应用一次
最简单的方法是迭代列,使用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