2024 Day 02 Complete!
This commit is contained in:
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
|
||||
}
|
||||
Reference in New Issue
Block a user