From c3796ec33845f051403d0d829879a2cf25ad4b97 Mon Sep 17 00:00:00 2001 From: stanislas Date: Tue, 3 Dec 2024 15:20:27 +0100 Subject: [PATCH 1/2] day 2 - part 1 - refactoring --- src/aoc_2024/day2/part1.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/aoc_2024/day2/part1.py b/src/aoc_2024/day2/part1.py index 2c18059..548729a 100644 --- a/src/aoc_2024/day2/part1.py +++ b/src/aoc_2024/day2/part1.py @@ -25,14 +25,6 @@ def is_report_safe(report: list[int]) -> bool: return True -def get_records(input_file: Path) -> list[list[int]]: - records = [] - for line in input_file.open(): - record = [int(i) for i in line.strip().split(" ")] - records.append(record) - return records - - def get_reports(input_file: Path) -> list[list[int]]: reports = [] for line in input_file.open(): From 6e40648ec6bdd01c63eb635648da16485d738886 Mon Sep 17 00:00:00 2001 From: stanislas Date: Tue, 3 Dec 2024 15:31:18 +0100 Subject: [PATCH 2/2] day 2 - part 2 --- src/aoc_2024/day2/part2.py | 61 +++++++++++++++++++++++++++ tests/aoc_2024/day2/test-part2.py | 68 +++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 src/aoc_2024/day2/part2.py create mode 100644 tests/aoc_2024/day2/test-part2.py diff --git a/src/aoc_2024/day2/part2.py b/src/aoc_2024/day2/part2.py new file mode 100644 index 0000000..971e95d --- /dev/null +++ b/src/aoc_2024/day2/part2.py @@ -0,0 +1,61 @@ +from pathlib import Path + + +def is_report_safe(report: list[int]) -> bool: + try: + is_increasing = True + is_decreasing = True + for i in range(len(report)): + shift = report[i + 1] - report[i] + if shift == 0: + is_increasing = False + is_decreasing = False + if shift > 0: + is_decreasing = False + if shift < 0: + is_increasing = False + + if not is_decreasing and not is_increasing: + return False + + if abs(shift) > 3: + return False + except IndexError: + pass + return True + + +def is_report_safe_with_tolerance(report: list[int]) -> bool: + for i in range(len(report)): + tmp_report = list(report) + tmp_report.pop(i) + is_safe = is_report_safe(tmp_report) + if is_safe: + return True + return False + + +def get_reports(input_file: Path) -> list[list[int]]: + reports = [] + for line in input_file.open(): + report = [int(r) for r in line.strip().split(" ")] + reports.append(report) + return reports + + +def main(data_file: Path): + reports = get_reports(data_file) + score = 0 + for report in reports: + if is_report_safe(report): + score += 1 + else: + if is_report_safe_with_tolerance(report): + score += 1 + print(score) + return score + + +if __name__ == "__main__": + file = Path(__file__).parent / "input-data" + main(file) diff --git a/tests/aoc_2024/day2/test-part2.py b/tests/aoc_2024/day2/test-part2.py new file mode 100644 index 0000000..5768d36 --- /dev/null +++ b/tests/aoc_2024/day2/test-part2.py @@ -0,0 +1,68 @@ +from pathlib import Path + +from aoc_2024.day2 import part2 + + +def test_report_with_tolerance_with_decreasing_levels_less_than_3_is_safe(): + report = [7, 6, 4, 2, 1] + assert part2.is_report_safe_with_tolerance(report) + + +def test_report_with_tolerance_with_decreasing_levels_more_than_3_is_not_safe(): + report = [9, 7, 6, 2, 1] + assert not part2.is_report_safe_with_tolerance(report) + + +def test_report_with_tolerance_without_increasing_or_decreasing_levels_is_not_safe(): + report = [8, 6, 4, 4, 1] + assert part2.is_report_safe_with_tolerance(report) + + +def test_report_with_tolerance_with_increasing_and_decreasing_levels_is_not_safe(): + report = [1, 3, 2, 4, 5] + assert part2.is_report_safe_with_tolerance(report) + + +def test_report_with_tolerance_with_increasing_levels_less_than_3_is_safe(): + report = [1, 3, 6, 7, 9] + assert part2.is_report_safe_with_tolerance(report) + + +def test_report_with_tolerance_with_increasing_levels_more_than_3_is_not_safe(): + report = [1, 2, 7, 8, 9] + assert not part2.is_report_safe_with_tolerance(report) + + +def test_report_with_decreasing_levels_less_than_3_is_safe(): + report = [7, 6, 4, 2, 1] + assert part2.is_report_safe(report) + + +def test_report_with_decreasing_levels_more_than_3_is_not_safe(): + report = [9, 7, 6, 2, 1] + assert not part2.is_report_safe(report) + + +def test_report_without_increasing_or_decreasing_levels_is_not_safe(): + report = [8, 6, 4, 4, 1] + assert not part2.is_report_safe(report) + + +def test_report_with_increasing_and_decreasing_levels_is_not_safe(): + report = [1, 3, 2, 4, 5] + assert not part2.is_report_safe(report) + + +def test_report_with_increasing_levels_less_than_3_is_safe(): + report = [1, 3, 6, 7, 9] + assert part2.is_report_safe(report) + + +def test_report_with_increasing_levels_more_than_3_is_not_safe(): + report = [1, 2, 7, 8, 9] + assert not part2.is_report_safe(report) + + +def test_read_records_file(): + test_file = Path(__file__).parent / "test-data" + assert part2.main(test_file) == 4