Solution to problem 2 in python

This commit is contained in:
David Doblas Jiménez 2022-01-23 17:55:11 +01:00
parent 76dd834e4e
commit 913284fded
2 changed files with 1116 additions and 0 deletions

116
src/Year_2021/P2.py Normal file
View File

@ -0,0 +1,116 @@
# --- Day 2: Dive! ---
# Now, you need to figure out how to pilot this thing.
# It seems like the submarine can take a series of commands like forward 1,
# down 2, or up 3:
# forward X increases the horizontal position by X units.
# down X increases the depth by X units.
# up X decreases the depth by X units.
# Note that since you're on a submarine, down and up affect your depth, and so
# they have the opposite result of what you might expect.
# The submarine seems to already have a planned course (your puzzle input).
# You should probably figure out where it's going. For example:
# forward 5
# down 5
# forward 8
# up 3
# down 8
# forward 2
# Your horizontal position and depth both start at 0. The steps above would
# then modify them as follows:
# forward 5 adds 5 to your horizontal position, a total of 5.
# down 5 adds 5 to your depth, resulting in a value of 5.
# forward 8 adds 8 to your horizontal position, a total of 13.
# up 3 decreases your depth by 3, resulting in a value of 2.
# down 8 adds 8 to your depth, resulting in a value of 10.
# forward 2 adds 2 to your horizontal position, a total of 15.
# After following these instructions, you would have a horizontal position of
# 15 and a depth of 10. (Multiplying these together produces 150.)
# Calculate the horizontal position and depth you would have after following
# the planned course. What do you get if you multiply your final horizontal
# position by your final depth?
with open("files/P2.txt", "r") as f:
instructions = [line for line in f.read().strip().split("\n")]
def part_1() -> None:
position, depth = 0, 0
for instruction in instructions:
pos, amount = instruction.split(" ")
if pos == "forward":
position += int(amount)
if pos == "down":
depth += int(amount)
if pos == "up":
depth -= int(amount)
print(f"Planned course for part 1 is {position * depth}")
# --- Part Two ---
# Based on your calculations, the planned course doesn't seem to make any
# sense. You find the submarine manual and discover that the process is
# actually slightly more complicated.
# In addition to horizontal position and depth, you'll also need to track a
# third value, aim, which also starts at 0. The commands also mean something
# entirely different than you first thought:
# down X increases your aim by X units.
# up X decreases your aim by X units.
# forward X does two things:
# It increases your horizontal position by X units.
# It increases your depth by your aim multiplied by X.
# Again note that since you're on a submarine, down and up do the opposite of
# what you might expect: "down" means aiming in the positive direction.
# Now, the above example does something different:
# forward 5 adds 5 to your horizontal position, a total of 5. Because your
# aim is 0, your depth does not change.
# down 5 adds 5 to your aim, resulting in a value of 5.
# forward 8 adds 8 to your horizontal position, a total of 13. Because your
# aim is 5, your depth increases by 8*5=40.
# up 3 decreases your aim by 3, resulting in a value of 2.
# down 8 adds 8 to your aim, resulting in a value of 10.
# forward 2 adds 2 to your horizontal position, a total of 15. Because your
# aim is 10, your depth increases by 2*10=20 to a total of 60.
# After following these new instructions, you would have a horizontal position
# of 15 and a depth of 60. (Multiplying these produces 900.)
# Using this new interpretation of the commands, calculate the horizontal
# position and depth you would have after following the planned course. What do
# you get if you multiply your final horizontal position by your final depth?
def part_2() -> None:
position, depth, aim = 0, 0, 0
for instruction in instructions:
pos, amount = instruction.split(" ")
if pos == "forward":
position += int(amount)
depth += aim * int(amount)
if pos == "down":
aim += int(amount)
if pos == "up":
aim -= int(amount)
print(f"Planned course for part 2 is {position * depth}")
if __name__ == "__main__":
part_1()
part_2()

1000
src/Year_2021/files/P2.txt Normal file

File diff suppressed because it is too large Load Diff