123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- package main
- import (
- "bufio"
- "fmt"
- "log"
- "os"
- "strconv"
- "strings"
- )
- var (
- MAX_INT int = int(^uint(0) >> 1)
- INT_SZ int = 0
- )
- func init() {
- tmp := MAX_INT
- for tmp > 0 {
- tmp >>= 1
- INT_SZ++
- }
- }
- func main() {
- reports := make([][]int, 0, 128)
- scanner := bufio.NewScanner(os.Stdin)
- reportLen := 0
- var lineCnt int
- for scanner.Scan() {
- if scanner.Err() != nil {
- log.Fatal("Unexpected error while reading input: ", scanner.Err())
- }
- lineCnt++
- fs := strings.Fields(scanner.Text())
- if reportLen != 0 && len(fs) != reportLen {
- log.Fatal(fmt.Sprintf("Unexpected number of fields at line %d of input", lineCnt))
- }
- report := make([]int, 0, 128)
- for i, f := range fs {
- level, err := strconv.ParseInt(f, 10, INT_SZ)
- if err != nil {
- log.Fatal(fmt.Sprintf("Unexpected level at line %d, level %d", lineCnt, i+1))
- }
- report = append(report, int(level))
- }
- reports = append(reports, report)
- }
- var safeCnt int
- for _, report := range reports {
- if isSafe(report) {
- safeCnt++
- }
- }
- fmt.Printf("safe = %d\n", safeCnt)
- }
- func isSafe(report []int) bool {
- if len(report) < 2 {
- return true
- }
- var lastDelta int
- for i := 1; i < len(report); i++ {
- delta := report[i] - report[i-1]
- switch {
- case delta < -3 || 3 < delta: // Not locally bounded
- return false
- case delta == 0: // Not strict monotonic
- return false
- case lastDelta*delta < 0 || 9 < lastDelta*delta: // Not monotonic
- return false
- }
- lastDelta = delta
- }
- return true
- }
|