From e253bc500686b7d9adec1686d20c75714cf2ddf0 Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Tue, 3 Dec 2024 16:40:08 +0000 Subject: Solve round 2 and 3 for 2024 --- 2024/puzzle-2.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 2024/puzzle-2.py (limited to '2024/puzzle-2.py') diff --git a/2024/puzzle-2.py b/2024/puzzle-2.py new file mode 100644 index 0000000..98f2efd --- /dev/null +++ b/2024/puzzle-2.py @@ -0,0 +1,43 @@ +lines = [] +with open("2-input", "r") as fp: + lines = fp.readlines() + +levels = [list(map(int, line.strip().split(" "))) for line in lines] + +def is_good_level_1(level): + # 1) Is decreasing + # 2) Sliding window of two cells (x, y) => 1 <= |x-y| <= 3 + # figure out if decreasing from first two + decreasing = level[0] > level[1] + for i in range(len(level) - 1): + x = level[i] + y = level[i + 1] + diff = abs(x - y) + if (decreasing and x < y) or (not decreasing and x > y) or not (diff <= 3 and diff >= 1): + return False + return True + +good_levels = [level for level in levels if is_good_level_1(level)] +print(f"Round 1: {len(good_levels)}") + +def check_two_levels(x, y, decreasing): + diff = abs(x - y) + return not ((decreasing and x < y) or (not decreasing and x > y) or not (diff <= 3 and diff >= 1)) + +def is_good_level_2(level): + # 1) Is decreasing + # 2) Sliding window of two cells (x, y) => 1 <= |x-y| <= 3 + # 3) Can remove any one item to make it safe + ret = is_good_level_1(level) + if not ret: + # Consider slices of the level and check if they're good + slices = [level[:i] + level[i + 1:] for i in range(len(level))] + for s in slices: + if is_good_level_1(s): + return True + else: + return True + return False + +good_levels = [level for level in levels if is_good_level_2(level)] +print(f"Round 2: {len(good_levels)}") -- cgit v1.2.3-13-gbd6f