2021 Day 02
This commit is contained in:
parent
9224ada9ba
commit
813cecc174
66
2021/02/README.md
Normal file
66
2021/02/README.md
Normal file
@ -0,0 +1,66 @@
|
||||
# 2021 Day 02: Dive!
|
||||
Copyright (c) Eric Wastl
|
||||
#### [Direct Link](https://adventofcode.com/2021/day/02)
|
||||
|
||||
## Part 1
|
||||
|
||||
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?`
|
||||
|
||||
## Part 2
|
||||
|
||||
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?**
|
37
2021/02/code.py
Normal file
37
2021/02/code.py
Normal file
@ -0,0 +1,37 @@
|
||||
# SPDX-License-Identifier: MIT
|
||||
# Copyright (c) 2021 Akumatic
|
||||
#
|
||||
# https://adventofcode.com/2021/day/02
|
||||
|
||||
def read_file() -> list:
|
||||
with open(f"{__file__.rstrip('code.py')}input.txt", "r") as f:
|
||||
return [(s[0], int(s[1])) for s in (line.split() for line in f.read().strip().split("\n"))]
|
||||
|
||||
def part1(commands: list) -> int:
|
||||
position, depth = 0, 0
|
||||
for com in commands:
|
||||
if com[0] == "forward":
|
||||
position += com[1]
|
||||
elif com[0] == "down":
|
||||
depth += com[1]
|
||||
else: #com[1] == "up"
|
||||
depth -= com[1]
|
||||
return position * depth
|
||||
|
||||
|
||||
def part2(commands: list) -> int:
|
||||
position, depth, aim = 0, 0, 0
|
||||
for com in commands:
|
||||
if com[0] == "forward":
|
||||
position += com[1]
|
||||
depth += aim * com[1]
|
||||
elif com[0] == "down":
|
||||
aim += com[1]
|
||||
else: #com[1] == "up"
|
||||
aim -= com[1]
|
||||
return position * depth
|
||||
|
||||
if __name__ == "__main__":
|
||||
vals = read_file()
|
||||
print(f"Part 1: {part1(vals)}")
|
||||
print(f"Part 2: {part2(vals)}")
|
1000
2021/02/input.txt
Normal file
1000
2021/02/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
2
2021/02/solution.txt
Normal file
2
2021/02/solution.txt
Normal file
@ -0,0 +1,2 @@
|
||||
Part 1: 1648020
|
||||
Part 2: 1759818555
|
14
2021/02/test_code.py
Normal file
14
2021/02/test_code.py
Normal file
@ -0,0 +1,14 @@
|
||||
# SPDX-License-Identifier: MIT
|
||||
# Copyright (c) 2021 Akumatic
|
||||
|
||||
from code import part1, part2
|
||||
|
||||
def test():
|
||||
vals = [("forward", 5), ("down", 5), ("forward", 8), ("up", 3), ("down", 8), ("forward", 2)]
|
||||
assert part1(vals) == 150
|
||||
print("Passed Part 1")
|
||||
assert part2(vals) == 900
|
||||
print("Passed Part 2")
|
||||
|
||||
if __name__ == "__main__":
|
||||
test()
|
@ -16,7 +16,7 @@ Collect stars by solving puzzles. Two puzzles will be made available on each day
|
||||
| Day | Part 1 | Part 2 | My Solution | Official Website |
|
||||
| --- | --- | --- |---| --- |
|
||||
| 01 | :white_check_mark: | :white_check_mark: | [Solution](01/code.py) | [Day 01](https://adventofcode.com/2021/day/1) |
|
||||
| 02 | | | | |
|
||||
| 02 | :white_check_mark: | :white_check_mark: | [Solution](02/code.py) | [Day 02](https://adventofcode.com/2021/day/2) |
|
||||
| 03 | | | | |
|
||||
| 04 | | | | |
|
||||
| 05 | | | | |
|
||||
|
Loading…
x
Reference in New Issue
Block a user