Day 6 solution

This commit is contained in:
2021-12-06 14:08:30 +00:00
parent 4f1fddf0eb
commit 84a1d25dbe
7 changed files with 150 additions and 0 deletions

View File

@@ -65,3 +65,13 @@ There are 5585 overlapping vents
There are 17193 overlapping vents
```
### Day six
```sh
$ ./aoc2021 --six
The solution for "six" is:
After 80 days there are 377263 fish
After 256 days there are 1695929023803 fish
```

View File

@@ -8,6 +8,7 @@ import (
"unsupervised.ca/aoc2021/five"
"unsupervised.ca/aoc2021/four"
"unsupervised.ca/aoc2021/one"
"unsupervised.ca/aoc2021/six"
"unsupervised.ca/aoc2021/three"
"unsupervised.ca/aoc2021/two"
)
@@ -37,6 +38,8 @@ func main() {
day = four.Init("four/input.txt")
case "five":
day = five.Init("five/input.txt")
case "six":
day = six.Init("six/input.txt")
default:
fmt.Printf("%q does not have a solution.\n", flagParts[1])
help()

1
six/input.txt Normal file
View File

@@ -0,0 +1 @@
5,1,1,5,4,2,1,2,1,2,2,1,1,1,4,2,2,4,1,1,1,1,1,4,1,1,1,1,1,5,3,1,4,1,1,1,1,1,4,1,5,1,1,1,4,1,2,2,3,1,5,1,1,5,1,1,5,4,1,1,1,4,3,1,1,1,3,1,5,5,1,1,1,1,5,3,2,1,2,3,1,5,1,1,4,1,1,2,1,5,1,1,1,1,5,4,5,1,3,1,3,3,5,5,1,3,1,5,3,1,1,4,2,3,3,1,2,4,1,1,1,1,1,1,1,2,1,1,4,1,3,2,5,2,1,1,1,4,2,1,1,1,4,2,4,1,1,1,1,4,1,3,5,5,1,2,1,3,1,1,4,1,1,1,1,2,1,1,4,2,3,1,1,1,1,1,1,1,4,5,1,1,3,1,1,2,1,1,1,5,1,1,1,1,1,3,2,1,2,4,5,1,5,4,1,1,3,1,1,5,5,1,3,1,1,1,1,4,4,2,1,2,1,1,5,1,1,4,5,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,4,2,1,1,1,2,5,1,4,1,1,1,4,1,1,5,4,4,3,1,1,4,5,1,1,3,5,3,1,2,5,3,4,1,3,5,4,1,3,1,5,1,4,1,1,4,2,1,1,1,3,2,1,1,4

65
six/lanternfish.go Normal file
View File

@@ -0,0 +1,65 @@
package six
import (
"bufio"
"os"
"strconv"
"strings"
)
type lanternfish struct {
fish map[int]int
population int
}
func (l *lanternfish) load(filename string) error {
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close()
scanner := bufio.NewScanner(file)
l.fish = map[int]int{}
for scanner.Scan() {
fishes := strings.Split(scanner.Text(), ",")
for _, fishy := range fishes {
f, err := strconv.Atoi(fishy)
if err != nil {
return err
}
l.fish[f]++
}
}
for _, count := range l.fish {
l.population += count
}
return nil
}
func (l *lanternfish) simulate(days int) {
for i := 0; i < days; i++ {
// How many fish spawn today
newFish := l.fish[0]
// Advance spawn counts
for j := 0; j < 8; j++ {
l.fish[j] = l.fish[j+1]
}
// Reset spawning fish to 6 days
l.fish[6] += newFish
// Add new fish to day 8
l.fish[8] = newFish
population := 0
for _, count := range l.fish {
population += count
}
l.population = population
}
}

44
six/lanternfish_test.go Normal file
View File

@@ -0,0 +1,44 @@
package six
import "testing"
func Test_read(t *testing.T) {
l := lanternfish{}
if err := l.load("test_input.txt"); err != nil {
t.Log(err)
t.FailNow()
}
if l.population != 5 {
t.Logf("Expected 5 fish, found %d", l.population)
t.Fail()
}
}
func Test_simulate(t *testing.T) {
l := lanternfish{}
l.load("test_input.txt")
l.simulate(18)
if l.population != 26 {
t.Logf("Expected 26 fish, found %d", l.population)
t.Fail()
}
l.simulate(62)
if l.population != 5934 {
t.Logf("Expected 5934 fish, found %d", l.population)
t.Fail()
}
}
func Test_simulateForever(t *testing.T) {
l := lanternfish{}
l.load("test_input.txt")
l.simulate(256)
if l.population != 26984457539 {
t.Logf("Expected 26984457539 fish, found %d", l.population)
t.Fail()
}
}

26
six/main.go Normal file
View File

@@ -0,0 +1,26 @@
package six
import "fmt"
type Six struct {
lanternfish lanternfish
}
func Init(filepath string) *Six {
six := &Six{
lanternfish: lanternfish{},
}
six.lanternfish.load(filepath)
return six
}
func (d *Six) Answer() string {
d.lanternfish.simulate(80)
return fmt.Sprintf("After 80 days there are %d fish", d.lanternfish.population)
}
func (d *Six) FollowUp() string {
d.lanternfish.simulate(176)
return fmt.Sprintf("After 256 days there are %d fish", d.lanternfish.population)
}

1
six/test_input.txt Normal file
View File

@@ -0,0 +1 @@
3,4,3,1,2