Advent of Code
My solutions to the Advent of Code challenges.
Day 1
with open("./day_1_input.txt", "r") as file:
data = file.read().split("\n\n")
elves = [i.split("\n") for i in data]
highest = 0
for elf in elves:
calories = sum([int(i) for i in elf])
if calories > highest:
highest = calories
print(f"Part 1: {highest}")
## Part 2
calories = []
for elf in elves:
calories.append(sum([int(i) for i in elf]))
calories.sort()
print(f"Part 2: {sum(calories[-3:])}")
Day 2
with open("./day_2_input.txt", "r") as f:
data = f.read()
data_lines = [i for i in data.split("\n")]
def score(me, opponent):
return 3 * ((me - opponent + 1) % 3) + me + 1
score_1 = 0
score_2 = 0
for line in data_lines:
opponent, me = map(ord, line.split(" "))
opponent -= ord("A")
me -= ord("X")
score_1 += score(me, opponent)
score_2 += score((opponent + me - 1) % 3, opponent)
print("Part 1:", score_1)
print("Part 2:", score_2)
Day 3
with open("./day_3_input.txt", "r") as f:
data = f.read()
data_lines = [i for i in data.split("\n")]
def get_priority(letter):
if letter.islower():
return ord(letter) - ord("a") + 1
else:
return ord(letter) - ord("A") + 1 + 26
cum_result = 0
for i in data_lines:
len_line = int(len(i) / 2)
first_section, second_section = set(i[:len_line]), (i[len_line:])
value = list(first_section.intersection(second_section))[0]
result = get_priority(value)
cum_result += result
print(cum_result)
# Part 2
step = 3
cum_result_2 = 0
for x in range(0, len(data_lines), 3):
group_data = [set(i) for i in data_lines[x : x + step]]
letter = list(group_data[0].intersection(group_data[1], group_data[2]))[0]
result = get_priority(letter)
cum_result_2 += result
print(cum_result_2)
Day 4
with open("./day_4_input.txt", "r") as f:
data = f.read()
data_lines = [i for i in data.split("\n")]
# Part 1 & Part 2
counter = 0
inter = 0
for i in data_lines:
first, second = i.split(",")
f_start, f_end = first.split("-")
s_start, s_end = second.split("-")
first_set = set(range(int(f_start), int(f_end) + 1))
second_set = set(range(int(s_start), int(s_end) + 1))
if second_set.issubset(first_set):
counter += 1
if first_set.issubset(second_set):
counter += 1
if first_set == second_set:
counter -= 1
if first_set.intersection(second_set):
inter += 1
print(f"Part 1: {counter}")
print(f"Part 2: {inter}")