day1. Solve second puzzle.
authorsgf <sgf.dma@gmail.com>
Tue, 7 Dec 2021 15:21:21 +0000 (18:21 +0300)
committersgf <sgf.dma@gmail.com>
Tue, 7 Dec 2021 15:21:21 +0000 (18:21 +0300)
day1a/main.go

index c41bae0..9695809 100644 (file)
@@ -25,16 +25,78 @@ func f1 (r io.Reader) (int, error) {
     return i-1, nil
 }
 
+func fillBuffer(s *bufio.Scanner, buf []int) (int, error) {
+    i := 0
+    for s.Scan() {
+        x, err := strconv.Atoi(s.Text())
+        if err != nil {
+            return 0, fmt.Errorf("%v\n", err)
+        }
+        buf[i] = x
+        i++
+        if i >= len(buf) { break }
+    }
+    return i, nil
+}
+
+func sum(xs []int) (r int) {
+    for i := 0; i < len(xs); i++ {
+        r += xs[i]
+    }
+    return r
+}
+
+func compareBuffer(buf []int) (z int) {
+    //fmt.Printf("Compare buffer %v (%d)\n", buf, len(buf))
+    for j := 4; j <= len(buf); j++ {
+        x := buf[j-4:j-1]
+        y := buf[j-3:j]
+        //fmt.Printf("Compare %v (%d) with %v (%d) at %d\n", x, sum(x), y, sum(y), j)
+        if sum(x) < sum(y) {
+            z++
+        }
+    }
+    return
+}
+
+func f2 (r io.Reader) (int, error) {
+    s := bufio.NewScanner(r)
+    var buf []int = make([]int, 1024)
+    z := 0
+    k := 0
+    for {
+        n, err := fillBuffer(s, buf[k:])
+        if err != nil {
+            return 0, fmt.Errorf("%v\n", err)
+        }
+        if n == 0 { break }
+        z += compareBuffer(buf[:k+n])
+        //fmt.Printf("Current increases %d\n", z)
+
+        copy(buf, buf[n+k-3:])
+        k = 3
+    }
+    return z, nil
+}
+
 func main() {
     h0, err := os.Open("input.txt")
     if err != nil { return }
     defer h0.Close()
 
+    /*
     i, err := f1(h0)
     if err != nil {
         fmt.Printf("Error: %v\n", err)
         return
     }
     fmt.Printf("%d\n", i)
+    */
 
+    n, err := f2(h0)
+    if err != nil {
+        fmt.Printf("Error: %v\n", err)
+        return
+    }
+    fmt.Printf("Answer: %d\n", n)
 }