135 lines
4.3 KiB
Python
135 lines
4.3 KiB
Python
# --- Day 1: Sonar Sweep ---
|
|
|
|
# You're minding your own business on a ship at sea when the overboard alarm
|
|
# goes off! You rush to see if you can help. Apparently, one of the Elves
|
|
# tripped and accidentally sent the sleigh keys flying into the ocean!
|
|
|
|
# Before you know it, you're inside a submarine the Elves keep ready for
|
|
# situations like this. It's covered in Christmas lights (because of course it
|
|
# is), and it even has an experimental antenna that should be able to track the
|
|
# keys if you can boost its signal strength high enough; there's a little meter
|
|
# that indicates the antenna's signal strength by displaying 0-50 stars.
|
|
|
|
# Your instincts tell you that in order to save Christmas, you'll need to get
|
|
# all fifty stars by December 25th.
|
|
|
|
# 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!
|
|
|
|
# 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?
|
|
|
|
with open("files/P1.txt", "r") as f:
|
|
report = [int(number) for number in f.read().strip().split()]
|
|
|
|
|
|
def part_1(lst: list[int]) -> int:
|
|
increments = sum(
|
|
1 for idx, val in enumerate(lst) if idx > 0 and lst[idx] > lst[idx - 1]
|
|
)
|
|
return increments
|
|
|
|
|
|
# --- Part Two ---
|
|
|
|
# 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?
|
|
|
|
|
|
def part_2(lst: list[int]) -> int:
|
|
increments = sum(
|
|
1
|
|
for idx, val in enumerate(lst)
|
|
if sum(lst[idx + 1 : idx + 4]) > sum(lst[idx : idx + 3])
|
|
)
|
|
return increments
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print(part_1(report))
|
|
print(part_2(report))
|