87 lines
1.8 KiB
Go
87 lines
1.8 KiB
Go
|
|
package main
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
"os"
|
||
|
|
"strings"
|
||
|
|
"strconv"
|
||
|
|
"github.com/thoas/go-funk"
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
func check(e error) {
|
||
|
|
if e != nil { panic(e) }
|
||
|
|
}
|
||
|
|
|
||
|
|
func abs(n int) int {
|
||
|
|
if n < 0 { return -n }
|
||
|
|
return n
|
||
|
|
}
|
||
|
|
|
||
|
|
func pop(arr []int, idx int) []int {
|
||
|
|
out := make([]int, len(arr) - 1)
|
||
|
|
|
||
|
|
for i, elem := range arr {
|
||
|
|
if i == idx {
|
||
|
|
continue
|
||
|
|
} else if i > idx {
|
||
|
|
out[i - 1] = elem
|
||
|
|
} else {
|
||
|
|
out[i] = elem
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return out
|
||
|
|
}
|
||
|
|
|
||
|
|
func change(s []int) []int {
|
||
|
|
out := make([]int, len(s) - 1)
|
||
|
|
for i := range out {
|
||
|
|
out[i] = s[i + 1] - s[i]
|
||
|
|
}
|
||
|
|
return out
|
||
|
|
}
|
||
|
|
|
||
|
|
func validate_change(change []int) bool {
|
||
|
|
all_neg := len( funk.Filter(change, func(x int) bool { return x >= 0 }).([]int) ) == 0
|
||
|
|
all_pos := len( funk.Filter(change, func(x int) bool { return x <= 0 }).([]int) ) == 0
|
||
|
|
all_abs_lt_4 := len( funk.Filter(change, func(x int) bool { return abs(x) > 3 }).([]int) ) == 0
|
||
|
|
|
||
|
|
return ( all_neg || all_pos ) && all_abs_lt_4
|
||
|
|
}
|
||
|
|
|
||
|
|
func main() {
|
||
|
|
// read in file as lines
|
||
|
|
dat, err := os.ReadFile("data.txt")
|
||
|
|
check(err)
|
||
|
|
|
||
|
|
valid := 0
|
||
|
|
lines := strings.Split(string(dat), "\n")
|
||
|
|
|
||
|
|
// for every non empty line
|
||
|
|
for _, line := range lines {
|
||
|
|
if line == "" { continue }
|
||
|
|
|
||
|
|
// get numbers as array
|
||
|
|
str_levels := strings.Split(line, " ")
|
||
|
|
|
||
|
|
// convert to integer
|
||
|
|
levels := make([]int, len(str_levels))
|
||
|
|
for j := range str_levels {
|
||
|
|
levels[j], err = strconv.Atoi(str_levels[j])
|
||
|
|
check(err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// check for valid series
|
||
|
|
for i := range levels {
|
||
|
|
slice := pop(levels, i)
|
||
|
|
if validate_change(change(slice)) {
|
||
|
|
valid++
|
||
|
|
break
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
fmt.Println(valid)
|
||
|
|
}
|