Solved 2024/02 P1 + P2
This commit is contained in:
parent
fb04866c9c
commit
da43d0c6a6
100
2024/02/2.md
Normal file
100
2024/02/2.md
Normal file
@ -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).
|
||||||
|
|
88
2024/02/solution.py
Normal file
88
2024/02/solution.py
Normal file
@ -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)
|
1
2024/02/test2
Normal file
1
2024/02/test2
Normal file
@ -0,0 +1 @@
|
|||||||
|
8 6 4 4 1
|
2
2024/02/test3
Normal file
2
2024/02/test3
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
1 1 2
|
||||||
|
2 6 1
|
@ -3,7 +3,7 @@
|
|||||||
## 2024
|
## 2024
|
||||||
|
|
||||||
.--'~ ~ ~| .-' * \ / '-. 1 **
|
.--'~ ~ ~| .-' * \ / '-. 1 **
|
||||||
|
.--'~ ,* ~ | | <o> \_\_\|_/__/ | 2 **
|
||||||
## 2023
|
## 2023
|
||||||
|
|
||||||
. * ~~~~ /\ ' . 14
|
. * ~~~~ /\ ' . 14
|
||||||
@ -62,7 +62,7 @@
|
|||||||
|
|
||||||
.-----------------------------------------------.
|
.-----------------------------------------------.
|
||||||
| o──────*──────┐o┬──────────────────┐┌───────┐ | 25 *
|
| o──────*──────┐o┬──────────────────┐┌───────┐ | 25 *
|
||||||
| o──*──┐└───┐o─┴─┘o────────┬─────o┌─┘├───o┌──┤ | 24 *
|
| o──*──┐└───┐o─┴─┘o────────┬─────o┌─┘├───o┌──┤ | 24 **
|
||||||
| ┌──┘o─┴────┘┌────────────*├──────┘o─┘┌───┘┌─┘ | 23 *
|
| ┌──┘o─┴────┘┌────────────*├──────┘o─┘┌───┘┌─┘ | 23 *
|
||||||
| ├───┐┌──────┴o*──|(────┐┌┘└──────────┘o┬──┘o┐ | 22 **
|
| ├───┐┌──────┴o*──|(────┐┌┘└──────────┘o┬──┘o┐ | 22 **
|
||||||
| └┐o┐└┘*───────┘o┬─┬──┬┴┴┴┬───┬┴┴┴┴┬───┐└────┤ | 21 **
|
| └┐o┐└┘*───────┘o┬─┬──┬┴┴┴┬───┬┴┴┴┴┬───┐└────┤ | 21 **
|
||||||
|
Loading…
Reference in New Issue
Block a user