Solution to problem 1 in Python

This commit is contained in:
David Doblas Jiménez 2022-02-06 20:59:23 +01:00
parent 5060e8e5ca
commit 374ffba2fd

106
src/Year_2019/P1.py Normal file
View File

@ -0,0 +1,106 @@
# --- Day 1: The Tyranny of the Rocket Equation ---
# Santa has become stranded at the edge of the Solar System while delivering
# presents to other planets! To accurately calculate his position in space,
# safely align his warp drive, and return to Earth in time to save Christmas,
# he needs you to bring him measurements from fifty stars.
# Collect stars by solving puzzles. Two puzzles will be made available on each
# day in the Advent calendar; the second puzzle is unlocked when you complete
# the first. Each puzzle grants one star. Good luck!
# The Elves quickly load you into a spacecraft and prepare to launch.
# At the first Go / No Go poll, every Elf is Go until the Fuel Counter-Upper.
# They haven't determined the amount of fuel required yet.
# Fuel required to launch a given module is based on its mass. Specifically, to
# find the fuel required for a module, take its mass, divide by three, round
# down, and subtract 2.
# For example:
# For a mass of 12, divide by 3 and round down to get 4, then subtract 2 to
# get 2.
# For a mass of 14, dividing by 3 and rounding down still yields 4, so the
# fuel required is also 2.
# For a mass of 1969, the fuel required is 654.
# For a mass of 100756, the fuel required is 33583.
# The Fuel Counter-Upper needs to know the total fuel requirement. To find it,
# individually calculate the fuel needed for the mass of each module (your
# puzzle input), then add together all the fuel values.
# What is the sum of the fuel requirements for all of the modules on your
# spacecraft?
with open("files/P1.txt") as f:
fuel = [int(line) for line in f.read().strip().split()]
# fuel = [12, 14, 1969, 100756]
def part_1() -> None:
requirements = []
for mass in fuel:
# integer division
fuel_required = round(mass // 3) - 2
requirements.append(fuel_required)
print(f"The sum of fuel requirement is {sum(requirements)}")
# --- Part Two ---
# During the second Go / No Go poll, the Elf in charge of the Rocket Equation
# Double-Checker stops the launch sequence. Apparently, you forgot to include
# additional fuel for the fuel you just added.
# Fuel itself requires fuel just like a module - take its mass, divide by
# three, round down, and subtract 2. However, that fuel also requires fuel, and
# that fuel requires fuel, and so on. Any mass that would require negative fuel
# should instead be treated as if it requires zero fuel; the remaining mass, if
# any, is instead handled by wishing really hard, which has no mass and is
# outside the scope of this calculation.
# So, for each module mass, calculate its fuel and add it to the total. Then,
# treat the fuel amount you just calculated as the input mass and repeat the
# process, continuing until a fuel requirement is zero or negative. For
# example:
# A module of mass 14 requires 2 fuel. This fuel requires no further fuel
# (2 divided by 3 and rounded down is 0, which would call for a negative fuel),
# so the total fuel required is still just 2.
# At first, a module of mass 1969 requires 654 fuel. Then, this fuel
# requires 216 more fuel (654 / 3 - 2). 216 then requires 70 more fuel, which
# requires 21 fuel, which requires 5 fuel, which requires no further fuel. So,
# the total fuel required for a module of mass 1969 is 654 + 216 + 70 + 21 + 5
# = 966.
# The fuel required by a module of mass 100756 and its fuel is:
# 33583 + 11192 + 3728 + 1240 + 411 + 135 + 43 + 12 + 2 = 50346.
# What is the sum of the fuel requirements for all of the modules on your
# spacecraft when also taking into account the mass of the added fuel?
# (Calculate the fuel requirements for each module separately, then add them
# all up at the end.)
def part_2() -> None:
requirements = []
for mass in fuel:
# integer division
fuel_required = round(mass // 3) - 2
requirements.append(fuel_required)
# keep going until zero or negative
while fuel_required > 0:
fuel_required = round(fuel_required // 3) - 2
# if negative, do not add
if fuel_required > 0:
requirements.append(fuel_required)
print(f"The sum of the new fuel requirement is {sum(requirements)}")
if __name__ == "__main__":
part_1()
part_2()