### Source: Dive!

**Part 1:** Simulate a submarine with 3 commands: `forward N`

, `down N`

, and `up N`

that move forward, increase depth, and decrease depth in that order. Calculate the product of the final position and depth.

Let’s just hit this one directly:

```
def part1(commands: typer.FileText):
position, depth = 0, 0
for command in commands:
key, value = command.split()
value = int(value)
if key == 'forward':
position += value
elif key == 'down':
depth += value
elif key == 'up':
depth -= value
print(f'{position=}, {depth=}, {position*depth=}')
```

Keep track of the current `position`

and `depth`

and then for every command, update them as needed. We can totally make this submarine fly out of the water, but that’s not mentioned in the problem!

The final output is the product of the final position and depth, so print all that out:

```
$ python3 submarine-simulator.py part1 input.txt
position=2007, depth=747, position*depth=1499229
```

Cool.

**Part 2:** Change `down`

and `up`

so that they angle the submarine instead. Now `foward N`

moves both forward and decreases/increases depth by the current angle * the speed. Calculate `position * depth`

with this new setup.

This is mostly understanding the prompt:

```
def part2(commands: typer.FileText):
position, depth, aim = 0, 0, 0
for command in commands:
key, value = command.split()
value = int(value)
if key == 'forward':
position += value
depth += aim * value
elif key == 'down':
aim += value
elif key == 'up':
aim -= value
print(f'{position=}, {depth=}, {position*depth=}')
```

We do go *quite* a bit deeper though:

```
$ python3 submarine-simulator.py part2 input.txt
position=2007, depth=668080, position*depth=1340836560
```

Onward!