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 }