main.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "log"
  6. "os"
  7. "strconv"
  8. "strings"
  9. )
  10. var (
  11. MAX_INT int = int(^uint(0) >> 1)
  12. INT_SZ int = 0
  13. )
  14. func init() {
  15. tmp := MAX_INT
  16. for tmp > 0 {
  17. tmp >>= 1
  18. INT_SZ++
  19. }
  20. }
  21. func main() {
  22. reports := make([][]int, 0, 128)
  23. scanner := bufio.NewScanner(os.Stdin)
  24. reportLen := 0
  25. var lineCnt int
  26. for scanner.Scan() {
  27. if scanner.Err() != nil {
  28. log.Fatal("Unexpected error while reading input: ", scanner.Err())
  29. }
  30. lineCnt++
  31. fs := strings.Fields(scanner.Text())
  32. if reportLen != 0 && len(fs) != reportLen {
  33. log.Fatal(fmt.Sprintf("Unexpected number of fields at line %d of input", lineCnt))
  34. }
  35. report := make([]int, 0, 128)
  36. for i, f := range fs {
  37. level, err := strconv.ParseInt(f, 10, INT_SZ)
  38. if err != nil {
  39. log.Fatal(fmt.Sprintf("Unexpected level at line %d, level %d", lineCnt, i+1))
  40. }
  41. report = append(report, int(level))
  42. }
  43. reports = append(reports, report)
  44. }
  45. var safeCnt int
  46. for _, report := range reports {
  47. if isSafe(report) {
  48. safeCnt++
  49. }
  50. }
  51. fmt.Printf("safe = %d\n", safeCnt)
  52. }
  53. func isSafe(report []int) bool {
  54. if len(report) < 2 {
  55. return true
  56. }
  57. var lastDelta int
  58. for i := 1; i < len(report); i++ {
  59. delta := report[i] - report[i-1]
  60. switch {
  61. case delta < -3 || 3 < delta: // Not locally bounded
  62. return false
  63. case delta == 0: // Not strict monotonic
  64. return false
  65. case lastDelta*delta < 0 || 9 < lastDelta*delta: // Not monotonic
  66. return false
  67. }
  68. lastDelta = delta
  69. }
  70. return true
  71. }