MIT License | MIT License | ||||
Copyright (c) <year> <copyright holders> | |||||
Copyright (c) 2021 Noëlle Anthony | |||||
Permission is hereby granted, free of charge, to any person obtaining a copy | Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
of this software and associated documentation files (the "Software"), to deal | of this software and associated documentation files (the "Software"), to deal |
def main(): | |||||
""" For each depth in the list, determine whether it's deeper than the previous depth. | |||||
There is no previous depth for the first entry. | |||||
Output the total number of times the depth increased. | |||||
""" | |||||
with open("aoc1-1.txt", "r") as file: | |||||
depths = file.readlines() | |||||
depths = [int(el.strip()) for el in depths] | |||||
prev = 999999999 | |||||
increases = [] | |||||
for depth in depths: | |||||
increases.append(1 if depth > prev else 0) | |||||
prev = depth | |||||
print(sum(increases)) | |||||
if __name__ == "__main__": | |||||
main() |
def main(): | |||||
""" Consider three-depth windows instead of individual depths: | |||||
199 A | |||||
200 A B | |||||
208 A B C | |||||
210 B C D | |||||
200 E C D | |||||
207 E F D | |||||
240 E F G | |||||
269 F G H | |||||
260 G H | |||||
263 H | |||||
For each window in the list, determine whether it's deeper than the previous window. | |||||
There is no previous depth for the first entry. | |||||
Output the total number of times the depth increased. | |||||
""" | |||||
with open("aoc1-1.txt", "r") as file: | |||||
depths = file.readlines() | |||||
depths = [int(el.strip()) for el in depths] | |||||
prev = 999999999 | |||||
increases = [] | |||||
for i in range(len(depths)-2): | |||||
window = depths[i] + depths[i+1] + depths[i+2] | |||||
increases.append(1 if window > prev else 0) | |||||
prev = window | |||||
print(sum(increases)) | |||||
if __name__ == "__main__": | |||||
main() |
def main(): | |||||
""" | |||||
horizontal position and vertical position both start at 0 | |||||
forward X increases forward (horizontal) position by X units | |||||
down X increases depth (vertical position) by X units | |||||
up X decreases depth (vertical position) by X units | |||||
After following all instructions multiply final h_pos by final v_pos | |||||
""" | |||||
h_pos, v_pos = 0, 0 | |||||
instructions = [] | |||||
with open("aoc2-1.txt", "r") as file: | |||||
instructions = file.readlines() | |||||
for inst in instructions: | |||||
dir, amt = inst.strip().split(" ") | |||||
amt = int(amt) | |||||
if dir == "forward": | |||||
h_pos += amt | |||||
elif dir == "down": | |||||
v_pos += amt | |||||
elif dir == "up": | |||||
v_pos -= amt | |||||
else: | |||||
raise ValueError(f"Unrecognized direction: {h_pos}") | |||||
return (h_pos * v_pos) | |||||
if __name__ == "__main__": | |||||
print(main()) |
def main(): | |||||
""" | |||||
horizontal position, vertical position, and aim both start at 0 | |||||
forward X increases forward (horizontal) position by X units | |||||
AND changes depth by (X * aim) units | |||||
down X increases aim (vertical angle) by X units | |||||
up X decreases aim (vertical angle) by X units | |||||
After following all instructions multiply final h_pos by final v_pos | |||||
""" | |||||
h_pos, v_pos, aim = 0, 0, 0 | |||||
instructions = [] | |||||
with open("aoc2-1.txt", "r") as file: | |||||
instructions = file.readlines() | |||||
for inst in instructions: | |||||
dir, amt = inst.strip().split(" ") | |||||
amt = int(amt) | |||||
if dir == "forward": | |||||
h_pos += amt | |||||
v_pos += (amt * aim) | |||||
elif dir == "down": | |||||
aim += amt | |||||
elif dir == "up": | |||||
aim -= amt | |||||
else: | |||||
raise ValueError(f"Unrecognized direction: {h_pos}") | |||||
return (h_pos * v_pos) | |||||
if __name__ == "__main__": | |||||
print(main()) |
import sys | |||||
def main(): | |||||
with open("aoc3-1.txt", "r") as file: | |||||
inputs = [el.strip() for el in file.readlines()] | |||||
digits = [[] for _ in range(len(inputs[0]))] | |||||
for j, ip in enumerate(inputs): | |||||
# print(digits, ip) | |||||
for i, dg in enumerate(ip): | |||||
# print(i, dg) | |||||
dg = dg.strip() | |||||
if dg != "": | |||||
digits[i].append(int(dg)) | |||||
# if j >= 2: | |||||
# sys.exit(0) | |||||
gamma, epsilon = [], [] | |||||
for el in digits: | |||||
gamma.append(1 if el.count(1) >= el.count(0) else 0) | |||||
epsilon.append(0 if el.count(1) >= el.count(0) else 1) | |||||
gamma_str = "".join([str(el) for el in gamma]) | |||||
epsilon_str = "".join([str(el) for el in epsilon]) | |||||
gamma_int = int(gamma_str, 2) | |||||
epsilon_int = int(epsilon_str, 2) | |||||
print(f"Gamma: {gamma_str} -- {gamma_int}") | |||||
print(f"Epsilon: {epsilon_str} -- {epsilon_int}") | |||||
print(f"Consumption: {gamma_int*epsilon_int}") | |||||
if __name__ == "__main__": | |||||
main() |
def common_digit(list_of_lists: list, position: int, most=True) -> int: | |||||
digits = [] | |||||
for ip in list_of_lists: | |||||
digits.append(int(ip[position])) | |||||
# print(f"1: {digits.count(1)}, 0: {digits.count(0)}", end="") | |||||
if not most: | |||||
return 0 if digits.count(1) >= digits.count(0) else 1 | |||||
return 1 if digits.count(1) >= digits.count(0) else 0 | |||||
def main() -> None: | |||||
with open("aoc3-1.txt", "r") as file: | |||||
inputs = [el.strip() for el in file.readlines()] | |||||
digits = [[] for _ in range(len(inputs[0]))] | |||||
for j, ip in enumerate(inputs): | |||||
for i, dg in enumerate(ip): | |||||
dg = dg.strip() | |||||
if dg != "": | |||||
digits[i].append(int(dg)) | |||||
gamma, epsilon = [], [] | |||||
for el in digits: | |||||
gamma.append(1 if el.count(1) >= el.count(0) else 0) | |||||
epsilon.append(0 if el.count(1) >= el.count(0) else 1) | |||||
gamma_str = "".join([str(el) for el in gamma]) | |||||
epsilon_str = "".join([str(el) for el in epsilon]) | |||||
gamma_int = int(gamma_str, 2) | |||||
epsilon_int = int(epsilon_str, 2) | |||||
print(f"Gamma: {gamma_str} -- {gamma_int}") | |||||
print(f"Epsilon: {epsilon_str} -- {epsilon_int}") | |||||
print(f"Consumption: {gamma_int*epsilon_int}") | |||||
oxy_inputs = [el for el in inputs] | |||||
co2_inputs = [el for el in inputs] | |||||
i = 0 | |||||
while len(oxy_inputs) > 1: | |||||
mcd = common_digit(oxy_inputs, i) | |||||
oxy_inputs = [el for el in oxy_inputs if el[i] == str(mcd)] | |||||
# print(f", MCD: {mcd}, len: {len(oxy_inputs)}") | |||||
i += 1 | |||||
i = 0 | |||||
while len(co2_inputs) > 1: | |||||
lcd = common_digit(co2_inputs, i, False) | |||||
co2_inputs = [el for el in co2_inputs if el[i] == str(lcd)] | |||||
# print(f", LCD: {lcd}, len: {len(co2_inputs)}") | |||||
i += 1 | |||||
oxy_str, co2_str = oxy_inputs[0], co2_inputs[0] | |||||
oxy_int, co2_int = int(oxy_str, 2), int(co2_str, 2) | |||||
print(f"Oxygen: {oxy_str} -- {oxy_int}") | |||||
print(f"CO2: {co2_str} -- {co2_int}") | |||||
print(f"Life support: {oxy_int*co2_int}") | |||||
if __name__ == "__main__": | |||||
main() |