Day 06
This commit is contained in:
parent
7ae38c997f
commit
6eb4d9cc3c
|
@ -0,0 +1 @@
|
||||||
|
1,1,1,2,1,1,2,1,1,1,5,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,4,1,1,1,1,3,1,1,3,1,1,1,4,1,5,1,3,1,1,1,1,1,5,1,1,1,1,1,5,5,2,5,1,1,2,1,1,1,1,3,4,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,5,4,1,1,1,1,1,5,1,2,4,1,1,1,1,1,3,3,2,1,1,4,1,1,5,5,1,1,1,1,1,2,5,1,4,1,1,1,1,1,1,2,1,1,5,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,3,1,1,3,1,3,1,4,1,5,4,1,1,2,1,1,5,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,4,1,1,4,1,1,1,1,1,1,1,5,4,1,2,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,4,1,1,1,2,1,4,1,1,1,1,1,1,1,1,1,4,2,1,2,1,1,4,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,3,2,1,4,1,5,1,1,1,4,5,1,1,1,1,1,1,5,1,1,5,1,2,1,1,2,4,1,1,2,1,5,5,3
|
|
@ -0,0 +1,64 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
inputBytes, _ := os.ReadFile("input.txt")
|
||||||
|
input := string(inputBytes)
|
||||||
|
|
||||||
|
log.Println("Puzzle 1:", puzzle1(input))
|
||||||
|
log.Println("Puzzle 2:", puzzle2(input))
|
||||||
|
}
|
||||||
|
|
||||||
|
func puzzle1(input string) int {
|
||||||
|
return do(input, 80)
|
||||||
|
}
|
||||||
|
|
||||||
|
func puzzle2(input string) int {
|
||||||
|
return do(input, 256)
|
||||||
|
}
|
||||||
|
|
||||||
|
func do(input string, days int) int {
|
||||||
|
var fish []int
|
||||||
|
total := 0
|
||||||
|
// Parse initial state
|
||||||
|
for _, s := range strings.Split(input, ",") {
|
||||||
|
f, _ := strconv.Atoi(s)
|
||||||
|
fish = append(fish, f)
|
||||||
|
}
|
||||||
|
// Run simulation for each fish
|
||||||
|
for _, f := range fish {
|
||||||
|
total += countDescendants(f, days)
|
||||||
|
}
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
var cache = map[string]int{}
|
||||||
|
|
||||||
|
func countDescendants(f int, days int) int {
|
||||||
|
if days == 0 || f-days >= 0 {
|
||||||
|
// Won't grow further
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
// Check cache
|
||||||
|
if c, ok := cache[fmt.Sprintf("%d:%d", f, days)]; ok {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
result := 0
|
||||||
|
if f == 0 {
|
||||||
|
// Add new fish
|
||||||
|
result = countDescendants(6, days-1) + countDescendants(8, days-1)
|
||||||
|
} else {
|
||||||
|
// Continue counting
|
||||||
|
result = countDescendants(f-1, days-1)
|
||||||
|
}
|
||||||
|
// Cache result
|
||||||
|
cache[fmt.Sprintf("%d:%d", f, days)] = result
|
||||||
|
return result
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test(t *testing.T) {
|
||||||
|
inputBytes, _ := os.ReadFile("test.txt")
|
||||||
|
input := string(inputBytes)
|
||||||
|
|
||||||
|
assert.Equal(t, 5934, puzzle1(input))
|
||||||
|
assert.Equal(t, 26984457539, puzzle2(input))
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
3,4,3,1,2
|
Reference in New Issue