day 2 done
This commit is contained in:
parent
ade11dd2f3
commit
e50989bbbf
177
day2/main.go
Normal file
177
day2/main.go
Normal 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
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user