feat: day 2 completed
This commit is contained in:
@@ -2,4 +2,5 @@
|
||||
|
||||
See: https://adventofcode.com/2024
|
||||
|
||||
- [Day 1: Historian Hysteria](day_1/README.md)
|
||||
- [Day 1: Historian Hysteria](day_1/README.md)
|
||||
- [Day 2: Red-Nosed Reports](day_2/README.md)
|
||||
|
||||
3
day_2/README.md
Normal file
3
day_2/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# --- Day 2: Red-Nosed Reports ---
|
||||
|
||||
See: https://adventofcode.com/2024/day/2
|
||||
6
day_2/example.txt
Normal file
6
day_2/example.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
7 6 4 2 1
|
||||
1 2 7 8 9
|
||||
9 7 6 2 1
|
||||
1 3 2 4 5
|
||||
8 6 4 4 1
|
||||
1 3 6 7 9
|
||||
1000
day_2/input.txt
Normal file
1000
day_2/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
77
day_2/main.py
Normal file
77
day_2/main.py
Normal file
@@ -0,0 +1,77 @@
|
||||
from typing import List, TextIO
|
||||
|
||||
|
||||
def read_input(f: TextIO) -> List[int]:
|
||||
for line in f:
|
||||
yield [int(n) for n in line.strip().split()]
|
||||
|
||||
|
||||
def is_safe(report: List[int]) -> bool:
|
||||
increasing = True
|
||||
for j in range(0, len(report)):
|
||||
n1, n2 = report[j], report[j + 1]
|
||||
|
||||
if n1 == n2:
|
||||
return False
|
||||
|
||||
increasing = n2 > n1
|
||||
break
|
||||
|
||||
for j in range(0, len(report)):
|
||||
if j == len(report) - 1:
|
||||
break
|
||||
|
||||
n1, n2 = report[j], report[j + 1]
|
||||
if n1 == n2:
|
||||
return False
|
||||
if increasing and n1 > n2:
|
||||
return False
|
||||
if not increasing and n1 < n2:
|
||||
return False
|
||||
|
||||
if 1 < abs(n2 - n1) > 3:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def count_safe_reports(f: TextIO) -> int:
|
||||
total = 0
|
||||
for report in read_input(f):
|
||||
safe = is_safe(report)
|
||||
|
||||
if safe:
|
||||
total += 1
|
||||
|
||||
return total
|
||||
|
||||
|
||||
def count_safe_reports_with_tolerance(f: TextIO) -> int:
|
||||
total = 0
|
||||
for report in read_input(f):
|
||||
safe = is_safe(report)
|
||||
|
||||
if not safe:
|
||||
for n in range(1, len(report)+1):
|
||||
safe = is_safe(report[0:n-1] + report[n:])
|
||||
if safe:
|
||||
break
|
||||
|
||||
if safe:
|
||||
total += 1
|
||||
|
||||
return total
|
||||
|
||||
|
||||
def main():
|
||||
input_file = "input.txt"
|
||||
|
||||
with open(input_file, "r") as f:
|
||||
print(f"safe_reports = {count_safe_reports(f)}")
|
||||
|
||||
with open(input_file, "r") as f:
|
||||
print(f"safe_reports_with_tolerance = {count_safe_reports_with_tolerance(f)}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user