day 2 done

This commit is contained in:
Michael Bobbitt 2024-12-03 08:00:04 -05:00
parent ade11dd2f3
commit e50989bbbf
2 changed files with 181 additions and 0 deletions

177
day2/main.go Normal file
View File

@ -0,0 +1,177 @@
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
if len(os.Args) < 2 {
panic("Provide input file")
}
inputFile := os.Args[1]
part1 := part1(inputFile)
fmt.Printf("(%s) Part 1: %d\n", inputFile, part1)
part2 := part2(inputFile)
fmt.Printf("(%s) Part 2: %d\n", inputFile, part2)
}
func part2(inputFile string) int {
input, err := os.Open(inputFile)
if err != nil {
panic(err)
}
defer input.Close()
var rawReports []string
scanner := bufio.NewScanner(input)
for scanner.Scan() {
rawReports = append(rawReports, scanner.Text())
}
safeReports := 0
for _, report := range rawReports {
if safe2(report) {
safeReports++
}
}
return safeReports
}
func safe2(line string) bool {
var safe bool
levels := strings.Split(line, " ")
levelInts := make([]int, len(levels))
for i, level := range levels {
fmt.Sscanf(level, "%d", &levelInts[i])
}
// now we can remove any one level and check if it passes the 1-3 increasing or decreasing check
dampener := -1
combinations := len(levelInts) + 1
for i := 0; i < combinations; i++ {
testArray := make([]int, 0)
if dampener > -1 { // we can try skipping a level
for j := 0; j < len(levelInts); j++ {
if j != dampener {
testArray = append(testArray, levelInts[j])
}
}
} else { // try the original levels no skipping
for j := 0; j < len(levelInts); j++ {
testArray = append(testArray, levelInts[j])
}
}
var increasing bool
if testArray[1] > testArray[0] {
increasing = true
} else {
increasing = false
}
for i := 1; i < len(testArray); i++ {
if increasing {
if testArray[i]-testArray[i-1] > 3 || testArray[i]-testArray[i-1] < 1 {
safe = false
break
}
if testArray[i] < testArray[i-1] {
safe = false
break
}
safe = true
} else {
if testArray[i-1]-testArray[i] > 3 || testArray[i-1]-testArray[i] < 1 {
safe = false
break
}
if testArray[i-1] < testArray[i] {
safe = false
break
}
safe = true
}
}
if safe { // if we find a safe report we can return
return safe
} else { // if not we can try skipping levels using the dampener
dampener++
}
}
return safe
}
func part1(inputFile string) int {
input, err := os.Open(inputFile)
if err != nil {
panic(err)
}
defer input.Close()
var rawReports []string
scanner := bufio.NewScanner(input)
for scanner.Scan() {
rawReports = append(rawReports, scanner.Text())
}
safeReports := 0
for _, report := range rawReports {
if safe(report) {
safeReports++
}
}
return safeReports
}
func safe(line string) bool {
// safe if all adjacent numbers differ by 1-3 (inclusive)
levels := strings.Split(line, " ")
levelInts := make([]int, len(levels))
for i, level := range levels {
fmt.Sscanf(level, "%d", &levelInts[i])
}
var increasing bool
if levelInts[1] > levelInts[0] {
increasing = true
} else {
increasing = false
}
if increasing {
for i := 1; i < len(levelInts); i++ {
if levelInts[i]-levelInts[i-1] > 3 || levelInts[i]-levelInts[i-1] < 1 {
return false
}
if levelInts[i] < levelInts[i-1] {
return false
}
}
return true
} else {
for i := 1; i < len(levelInts); i++ {
if levelInts[i-1]-levelInts[i] > 3 || levelInts[i-1]-levelInts[i] < 1 {
return false
}
if levelInts[i-1] < levelInts[i] {
return false
}
}
return true
}
}

4
day2/run Executable file
View File

@ -0,0 +1,4 @@
#!/bin/bash
go build -o ./bin/solution ./main.go
./bin/solution "$1"