diff --git a/2024/02/2.md b/2024/02/2.md new file mode 100644 index 0000000..e255b99 --- /dev/null +++ b/2024/02/2.md @@ -0,0 +1,100 @@ +## \-\-- Day 2: Red-Nosed Reports \-\-- + +Fortunately, the first location The Historians want to search isn\'t a +long walk from the Chief Historian\'s office. + +While the [Red-Nosed Reindeer nuclear fusion/fission +plant](/2015/day/19) appears to contain no sign of the Chief Historian, +the engineers there run up to you as soon as they see you. Apparently, +they *still* talk about the time Rudolph was saved through molecular +synthesis from a single electron. + +They\'re quick to add that - since you\'re already here - they\'d really +appreciate your help analyzing some unusual data from the Red-Nosed +reactor. You turn to check if The Historians are waiting for you, but +they seem to have already divided into groups that are currently +searching every corner of the facility. You offer to help with the +unusual data. + +The unusual data (your puzzle input) consists of many *reports*, one +report per line. Each report is a list of numbers called *levels* that +are separated by spaces. For example: + + 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 + +This example data contains six reports each containing five levels. + +The engineers are trying to figure out which reports are *safe*. The +Red-Nosed reactor safety systems can only tolerate levels that are +either gradually increasing or gradually decreasing. So, a report only +counts as safe if both of the following are true: + +- The levels are either *all increasing* or *all decreasing*. +- Any two adjacent levels differ by *at least one* and *at most + three*. + +In the example above, the reports can be found safe or unsafe by +checking those rules: + +- `7 6 4 2 1`: *Safe* because the levels are all decreasing by 1 or 2. +- `1 2 7 8 9`: *Unsafe* because `2 7` is an increase of 5. +- `9 7 6 2 1`: *Unsafe* because `6 2` is a decrease of 4. +- `1 3 2 4 5`: *Unsafe* because `1 3` is increasing but `3 2` is + decreasing. +- `8 6 4 4 1`: *Unsafe* because `4 4` is neither an increase or a + decrease. +- `1 3 6 7 9`: *Safe* because the levels are all increasing by 1, 2, + or 3. + +So, in this example, `2` reports are *safe*. + +Analyze the unusual data from the engineers. *How many reports are +safe?* + +Your puzzle answer was `252`. + +## \-\-- Part Two \-\-- {#part2} + +The engineers are surprised by the low number of safe reports until they +realize they forgot to tell you about the [Problem +Dampener]{title="I need to get one of these!"}. + +The Problem Dampener is a reactor-mounted module that lets the reactor +safety systems *tolerate a single bad level* in what would otherwise be +a safe report. It\'s like the bad level never happened! + +Now, the same rules apply as before, except if removing a single level +from an unsafe report would make it safe, the report instead counts as +safe. + +More of the above example\'s reports are now safe: + +- `7 6 4 2 1`: *Safe* without removing any level. +- `1 2 7 8 9`: *Unsafe* regardless of which level is removed. +- `9 7 6 2 1`: *Unsafe* regardless of which level is removed. +- `1 3 2 4 5`: *Safe* by removing the second level, `3`. +- `8 6 4 4 1`: *Safe* by removing the third level, `4`. +- `1 3 6 7 9`: *Safe* without removing any level. + +Thanks to the Problem Dampener, `4` reports are actually *safe*! + +Update your analysis by handling situations where the Problem Dampener +can remove a single level from unsafe reports. *How many reports are now +safe?* + +Your puzzle answer was `324`. + +Both parts of this puzzle are complete! They provide two gold stars: +\*\* + +At this point, you should [return to your Advent calendar](/2024) and +try another puzzle. + +If you still want to see it, you can [get your puzzle +input](2/input). + diff --git a/2024/02/solution.py b/2024/02/solution.py new file mode 100644 index 0000000..0c42cde --- /dev/null +++ b/2024/02/solution.py @@ -0,0 +1,88 @@ +#!/bin/python3 +import sys,re +from pprint import pprint +sys.path.insert(0, '../../') +from fred import list2int,get_re,nprint,lprint + +input_f = 'input' + +part = 2 +######################################### +# # +# Part 1 # +# # +######################################### + +def checkInc(line:list): + safe = False + for i in range(0,len(line)-1): + if line[i] < line[i+1]: + safe = True + else: + return False + return safe + +def checkDesc(line:list): + safe = False + for i in range(0,len(line)-1): + if line[i] > line[i+1]: + safe = True + else: + return False + return safe + +def checkJump(line:list): + safe = False + for i in range(0,len(line)-1): + if abs(line[i] - line[i+1]) in [1,2,3]: + safe = True + else: + return False + return safe + + +if part == 1: + reports = [] + count = 0 + with open(input_f) as file: + for line in file: + reports.append(list2int(line.rstrip().split())) + + for r in reports: + if (checkDesc(r) or checkInc(r)) and checkJump(r): + count += 1 + print(count) + + + +######################################### +# # +# Part 2 # +# # +######################################### +if part == 2: + reports = [] + count = 0 + j = 0 + with open(input_f) as file: + for line in file: + reports.append(list2int(line.rstrip().split())) + + for rdx,r in enumerate(reports): + if (checkDesc(r) or checkInc(r)) and checkJump(r): + count += 1 + else: + secondSafe = False + while not secondSafe: + tmp = r[:j] + r[j + 1:] + if (checkDesc(tmp) or checkInc(tmp)) and checkJump(tmp): + count += 1 + secondSafe = True + + if not secondSafe and j > len(tmp)-1: + break + j += 1 + j = 0 + secondSafe = False + + print(count) diff --git a/2024/02/test2 b/2024/02/test2 new file mode 100644 index 0000000..92396e3 --- /dev/null +++ b/2024/02/test2 @@ -0,0 +1 @@ +8 6 4 4 1 diff --git a/2024/02/test3 b/2024/02/test3 new file mode 100644 index 0000000..295fa65 --- /dev/null +++ b/2024/02/test3 @@ -0,0 +1,2 @@ +1 1 2 +2 6 1 diff --git a/README.md b/README.md index 16a42de..22f3b17 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## 2024 .--'~ ~ ~| .-' * \ / '-. 1 ** - + .--'~ ,* ~ | | \_\_\|_/__/ | 2 ** ## 2023 . * ~~~~ /\ ' . 14 @@ -62,7 +62,7 @@ .-----------------------------------------------. | o──────*──────┐o┬──────────────────┐┌───────┐ | 25 * - | o──*──┐└───┐o─┴─┘o────────┬─────o┌─┘├───o┌──┤ | 24 * + | o──*──┐└───┐o─┴─┘o────────┬─────o┌─┘├───o┌──┤ | 24 ** | ┌──┘o─┴────┘┌────────────*├──────┘o─┘┌───┘┌─┘ | 23 * | ├───┐┌──────┴o*──|(────┐┌┘└──────────┘o┬──┘o┐ | 22 ** | └┐o┐└┘*───────┘o┬─┬──┬┴┴┴┬───┬┴┴┴┴┬───┐└────┤ | 21 **