Working tree version
authorsgf <sgf.dma@gmail.com>
Fri, 4 Feb 2022 18:54:48 +0000 (21:54 +0300)
committersgf <sgf.dma@gmail.com>
Fri, 4 Feb 2022 18:54:48 +0000 (21:54 +0300)
day6/main.go
main.go
main_test.go [new file with mode: 0644]

index 627e2fe..606fe82 100644 (file)
@@ -63,9 +63,9 @@ func oneDay(ages []BirthTimer) ([]BirthTimer) {
     return ages
 }
 
-func RunF1(input string) {
+func RunF1Days(input string, days int) int {
     h0, err := os.Open(filepath.Join("day6", input))
-    if err != nil { return }
+    if err != nil { return }
     defer h0.Close()
 
     ages, err := readInput(h0)
@@ -74,12 +74,18 @@ func RunF1(input string) {
         ages = oneDay(ages)
         fmt.Printf("Day %v: %v\n", d, ages)
     }*/
-    for d := 0; d < 80; d++ {
+    //for d := 0; d < 80; d++ {
+    for d := 0; d < days; d++ {
         ages = oneDay(ages)
         //fmt.Printf("Day %v: %v\n", d, ages)
     }
 
-    fmt.Printf("Answer1: %v\n", len(ages))
+    return len(ages)
+}
+
+func RunF1 (input string) {
+    n := RunF1Days(input, 80)
+    fmt.Printf("Answer1: %v\n", n)
 }
 
 type Fish struct {
@@ -101,53 +107,54 @@ func readInput2(r io.Reader) (fishes []Fish, err error) {
 }
 
 func live(fish *Fish) {
-    if fish.age < 8 {
+    if fish.age < 9 {
         return
     }
-    fmt.Printf("   Fish: %v\n", fish)
-    fish.age -= 1
+    //fmt.Printf("   Fish: %v\n", fish)
+    fish.age -= 2
     for fish.age >= 7 {
         fish.age -= 7
         fish.childs = append(fish.childs, Fish{age: fish.age})
-        fmt.Printf("   Fish child: %v\n", fish)
+        //fmt.Printf("   Fish child: %v\n", fish)
     }
 }
 
 func liveDescendants(fish *Fish) {
     live(fish)
-    fmt.Printf("Fish lived: %v\n", fish)
+    //fmt.Printf("Fish lived: %v\n", fish)
     for i := 0; i < len(fish.childs); i++ {
-        fmt.Printf("Living descendant %d\n", i)
+        //fmt.Printf("Living descendant %d\n", i)
         liveDescendants(&fish.childs[i])
     }
 }
 
-func calculateAge(bt BirthTimer, days int) int {
-    return 8 - int(bt) + days
+func countNodes(fish Fish) int {
+    n := 1
+    for i := range fish.childs {
+        n += countNodes(fish.childs[i])
+    }
+    return n
 }
 
-func RunF2(input string) {
+func RunF2Days(input string, days int) int {
     h0, err := os.Open(filepath.Join("day6", input))
-    if err != nil { return }
+    if err != nil { return }
     defer h0.Close()
 
     fishes, err := readInput2(h0)
-    fmt.Printf("Starting with fishes: %v\n", fishes)
-    for _, x := range fishes[:1] {
-        fmt.Printf("### Live top-level fish %v\n", x)
-        x.age = x.age + 9
+    //fmt.Printf("Starting with fishes: %v\n", fishes)
+    n := 0
+    for _, x := range fishes {
+        //fmt.Printf("### Live top-level fish %v\n", x)
+        x.age = x.age + days
         liveDescendants(&x)
+        n += countNodes(x)
     }
-    /*
-    for d := 0; d < 18; d++ {
-        ages = oneDay(ages)
-        fmt.Printf("Day %v: %v\n", d, ages)
-    }*/
-    /*
-    for d := 0; d < 18; d++ {
-        ages = oneDay(ages)
-        //fmt.Printf("Day %v: %v\n", d, ages)
-    }*/
+    //fmt.Printf("Nodes: %v\n", n)
+    return n
+}
 
-    //fmt.Printf("Answer2: %v\n", len(ages))
+func RunF2(input string) {
+    n := RunF2Days(input, 80)
+    fmt.Printf("Nodes: %v\n", n)
 }
diff --git a/main.go b/main.go
index 10ffe7f..9b97a09 100644 (file)
--- a/main.go
+++ b/main.go
@@ -14,6 +14,6 @@ func main() {
     //day1.RunF1("day1/input.txt")
     //day1.RunF2("day1/input.txt")
 
-    day6.RunF1("in.txt")
+    //day6.RunF1("in.txt")
     day6.RunF2("in.txt")
 }
diff --git a/main_test.go b/main_test.go
new file mode 100644 (file)
index 0000000..be4881a
--- /dev/null
@@ -0,0 +1,19 @@
+
+package main
+
+import (
+    "testing"
+    "sgf-dma/aoc-2021/day6"
+)
+
+func BenchmarkRunF1Days(b *testing.B) {
+    for i := 0; i < b.N; i++ {
+        day6.RunF1Days("in.txt", 100)
+    }
+}
+
+func BenchmarkRunF2Days(b *testing.B) {
+    for i := 0; i < b.N; i++ {
+        day6.RunF2Days("in.txt", 100)
+    }
+}