2021 Day 01
This commit is contained in:
85
2021/01/README.md
Normal file
85
2021/01/README.md
Normal file
@ -0,0 +1,85 @@
|
||||
# 2021 Day 01: Sonar Sweep
|
||||
Copyright (c) Eric Wastl
|
||||
#### [Direct Link](https://adventofcode.com/2021/day/01)
|
||||
|
||||
## Part 1
|
||||
|
||||
As the submarine drops below the surface of the ocean, it automatically performs a sonar sweep of the nearby sea floor. On a small screen, the sonar sweep report (your puzzle input) appears: each line is a measurement of the sea floor depth as the sweep looks further and further away from the submarine.
|
||||
|
||||
For example, suppose you had the following report:
|
||||
|
||||
```
|
||||
199
|
||||
200
|
||||
208
|
||||
210
|
||||
200
|
||||
207
|
||||
240
|
||||
269
|
||||
260
|
||||
263
|
||||
```
|
||||
|
||||
This report indicates that, scanning outward from the submarine, the sonar sweep found depths of `199`, `200`, `208`, `210`, and so on.
|
||||
|
||||
The first order of business is to figure out how quickly the depth increases, just so you know what you're dealing with - you never know if the keys will get carried into deeper water by an ocean current or a fish or something.
|
||||
|
||||
To do this, count **the number of times a depth measurement increases** from the previous measurement. (There is no measurement before the first measurement.) In the example above, the changes are as follows:
|
||||
|
||||
```
|
||||
199 (N/A - no previous measurement)
|
||||
200 (increased)
|
||||
208 (increased)
|
||||
210 (increased)
|
||||
200 (decreased)
|
||||
207 (increased)
|
||||
240 (increased)
|
||||
269 (increased)
|
||||
260 (decreased)
|
||||
263 (increased)
|
||||
```
|
||||
|
||||
In this example, there are **`7`** measurements that are larger than the previous measurement.
|
||||
|
||||
**How many measurements are larger than the previous measurement?**
|
||||
|
||||
## Part 2
|
||||
|
||||
Considering every single measurement isn't as useful as you expected: there's just too much noise in the data.
|
||||
|
||||
Instead, consider sums of a **three-measurement sliding window**. Again considering the above example:
|
||||
|
||||
```
|
||||
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
|
||||
```
|
||||
|
||||
Start by comparing the first and second three-measurement windows. The measurements in the first window are marked `A` (`199`, `200`, `208`); their sum is `199 + 200 + 208 = 607`. The second window is marked `B` (`200`, `208`, `210`); its sum is `618`. The sum of measurements in the second window is larger than the sum of the first, so this first comparison **increased**.
|
||||
|
||||
Your goal now is to count **the number of times the sum of measurements in this sliding window increases** from the previous sum. So, compare `A` with `B`, then compare `B` with `C`, then `C` with `D`, and so on. Stop when there aren't enough measurements left to create a new three-measurement sum.
|
||||
|
||||
In the above example, the sum of each three-measurement window is as follows:
|
||||
|
||||
```
|
||||
A: 607 (N/A - no previous sum)
|
||||
B: 618 (increased)
|
||||
C: 618 (no change)
|
||||
D: 617 (decreased)
|
||||
E: 647 (increased)
|
||||
F: 716 (increased)
|
||||
G: 769 (increased)
|
||||
H: 792 (increased)
|
||||
```
|
||||
|
||||
In this example, there are **`5`** sums that are larger than the previous sum.
|
||||
|
||||
Consider sums of a three-measurement sliding window. **How many sums are larger than the previous sum?**
|
20
2021/01/code.py
Normal file
20
2021/01/code.py
Normal file
@ -0,0 +1,20 @@
|
||||
# SPDX-License-Identifier: MIT
|
||||
# Copyright (c) 2021 Akumatic
|
||||
#
|
||||
# https://adventofcode.com/2021/day/01
|
||||
|
||||
def read_file() -> list:
|
||||
with open(f"{__file__.rstrip('code.py')}input.txt", "r") as f:
|
||||
return [int(line) for line in f.read().strip().split("\n")]
|
||||
|
||||
def part1(vals: list) -> int:
|
||||
return sum(vals[i+1] > vals[i] for i in range(len(vals) - 1))
|
||||
|
||||
def part2(vals: list) -> int:
|
||||
return sum(vals[i+3] + vals[i+2] + vals[i+1] > vals[i+2] + vals[i+1] + vals[i]
|
||||
for i in range(len(vals) - 3))
|
||||
|
||||
if __name__ == "__main__":
|
||||
vals = read_file()
|
||||
print(f"Part 1: {part1(vals)}")
|
||||
print(f"Part 2: {part2(vals)}")
|
2000
2021/01/input.txt
Normal file
2000
2021/01/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
2
2021/01/solution.txt
Normal file
2
2021/01/solution.txt
Normal file
@ -0,0 +1,2 @@
|
||||
Part 1: 1139
|
||||
Part 2: 1103
|
14
2021/01/test_code.py
Normal file
14
2021/01/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 = [199,200,208,210,200,207,240,269,260,263]
|
||||
assert part1(vals) == 7
|
||||
print("Passed Part 1")
|
||||
assert part2(vals) == 5
|
||||
print("Passed Part 2")
|
||||
|
||||
if __name__ == "__main__":
|
||||
test()
|
Reference in New Issue
Block a user