2024 Day 02 Complete!
This commit is contained in:
1000
2024/day02/input
Normal file
1000
2024/day02/input
Normal file
File diff suppressed because it is too large
Load Diff
110
2024/day02/main.go
Normal file
110
2024/day02/main.go
Normal file
@@ -0,0 +1,110 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
helpers "git.bullercodeworks.com/brian/adventofcode/helpers"
|
||||
)
|
||||
|
||||
func main() {
|
||||
inp := helpers.StdinToStringSlice()
|
||||
part1(inp)
|
||||
part2(inp)
|
||||
}
|
||||
|
||||
func part1(inp []string) {
|
||||
var ret int
|
||||
for _, report := range inp {
|
||||
wrk := cleanReport(report)
|
||||
if testReport(wrk) {
|
||||
ret++
|
||||
}
|
||||
}
|
||||
fmt.Println("# Part 1")
|
||||
fmt.Printf("%d reports are safe\n", ret)
|
||||
}
|
||||
|
||||
func part2(inp []string) {
|
||||
var ret int
|
||||
for _, report := range inp {
|
||||
wrk := cleanReport(report)
|
||||
if testReport(wrk) {
|
||||
ret++
|
||||
} else {
|
||||
if testDampenedReport(wrk) {
|
||||
ret++
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Println("# Part 2")
|
||||
fmt.Printf("%d reports are safe\n", ret)
|
||||
}
|
||||
|
||||
func cleanReport(inp string) []int {
|
||||
var ret []int
|
||||
wrk := strings.Split(inp, " ")
|
||||
for i := range wrk {
|
||||
w, err := strconv.Atoi(wrk[i])
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
ret = append(ret, w)
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func testReport(report []int) bool {
|
||||
var prev int
|
||||
var dir int
|
||||
for idx, val := range report {
|
||||
switch idx {
|
||||
case 0:
|
||||
prev = val
|
||||
case 1:
|
||||
if val < prev {
|
||||
dir = -1
|
||||
} else {
|
||||
dir = 1
|
||||
}
|
||||
fallthrough
|
||||
default:
|
||||
if (val < prev && dir == 1) || (val > prev && dir == -1) {
|
||||
return false
|
||||
}
|
||||
if dir == 1 {
|
||||
if (val-prev < 1) || (val-prev > 3) {
|
||||
return false
|
||||
}
|
||||
} else {
|
||||
if (prev-val < 1) || (prev-val > 3) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
prev = val
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func testDampenedReport(report []int) bool {
|
||||
for i := range report {
|
||||
wrk := removeIdx(report, i)
|
||||
if testReport(wrk) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func removeIdx(a []int, idx int) []int {
|
||||
var ret []int
|
||||
for i := range a {
|
||||
if i == idx {
|
||||
continue
|
||||
}
|
||||
ret = append(ret, a[i])
|
||||
}
|
||||
return ret
|
||||
}
|
94
2024/day02/problem
Normal file
94
2024/day02/problem
Normal file
@@ -0,0 +1,94 @@
|
||||
Advent of Code
|
||||
|
||||
br0xen (AoC++) 4*
|
||||
|
||||
--- 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 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 479.
|
||||
|
||||
--- Part Two ---
|
||||
|
||||
The engineers are surprised by the low number of safe reports until they
|
||||
realize they forgot to tell you about the Problem Dampener.
|
||||
|
||||
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 531.
|
||||
|
||||
Both parts of this puzzle are complete! They provide two gold stars: **
|
||||
|
||||
At this point, you should return to your Advent calendar and try
|
||||
another puzzle.
|
||||
|
||||
If you still want to see it, you can get your puzzle input.
|
||||
|
||||
References
|
6
2024/day02/testinput
Normal file
6
2024/day02/testinput
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
|
Reference in New Issue
Block a user