116 lines
2.4 KiB
Go
116 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"math"
|
|
"os"
|
|
// "slices"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func rmIndex(s []int, i int) []int {
|
|
result := make([]int, 0)
|
|
result = append(result, s[:i]...)
|
|
result = append(result, s[i+1:]...)
|
|
return result
|
|
}
|
|
|
|
func isSorted(s []int) bool {
|
|
n := len(s)
|
|
asc := true
|
|
desc := true
|
|
for i := 1; i < n; i++ {
|
|
if s[i-1] < s[i] {
|
|
desc = false
|
|
}
|
|
if s[i-1] > s[i] {
|
|
asc = false
|
|
}
|
|
}
|
|
if asc || desc {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
|
|
func isSafe(r []int) bool {
|
|
if isSorted(r) {
|
|
for i := range r {
|
|
if i < len(r)-1 {
|
|
if math.Abs(float64(r[i]-r[i+1])) < 1 || math.Abs(float64(r[i]-r[i+1])) > 3 {
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
file, err := os.Open("input")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer file.Close()
|
|
scanner := bufio.NewScanner(file)
|
|
reports := [][]int{}
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
parts := strings.Fields(line)
|
|
levels := []int{}
|
|
for i := range parts {
|
|
level,_ := strconv.Atoi(parts[i])
|
|
levels = append(levels, level)
|
|
}
|
|
reports = append(reports, levels)
|
|
}
|
|
safeCount := 0
|
|
dampSafeCount := 0
|
|
for i := range reports {
|
|
if isSafe(reports[i]) {
|
|
safeCount++
|
|
} else {
|
|
for j := range reports[i] {
|
|
dampenedReport := rmIndex(reports[i], j)
|
|
if isSafe(dampenedReport) {
|
|
dampSafeCount++
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
fmt.Println("Safe Reports: ", safeCount)
|
|
fmt.Println("Dampened Safe Reports: ", dampSafeCount)
|
|
fmt.Println("Total Safe Reports: ", safeCount+dampSafeCount)
|
|
// sorted := 0
|
|
// unsorted := 0
|
|
// sortedUnsafe := 0
|
|
// for i := range reports {
|
|
// if ! isSorted(reports[i]) {
|
|
// unsorted++
|
|
// continue
|
|
// } else {
|
|
// sorted++
|
|
// for j := range reports[i] {
|
|
// if j < len(reports[i])-1 {
|
|
// if math.Abs(float64(reports[i][j]-reports[i][j+1])) < 1 || math.Abs(float64(reports[i][j]-reports[i][j+1])) > 3 {
|
|
// fmt.Println(reports[i])
|
|
// sortedUnsafe++
|
|
// break
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// fmt.Println(len(reports))
|
|
// fmt.Println("sorted lines: ", sorted)
|
|
// fmt.Println("unsorted lines: ", unsorted)
|
|
// fmt.Println("sortedUnsafe lines: ", sortedUnsafe)
|
|
// fmt.Println("safeCount math : ", len(reports) - unsorted - sortedUnsafe)
|
|
}
|