From 6a046fdb1cd6b35100177d854c528b796a404b6a Mon Sep 17 00:00:00 2001 From: Gregory Date: Wed, 11 May 2022 00:09:37 +0300 Subject: [PATCH] d14 --- d14/d14_test.go | 53 ++++++++++++++++++++++++++++++++++++++ d14/p1.go | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ d14/p2.go | 5 ++++ go.mod | 6 +++-- go.sum | 3 +++ main.go | 3 +++ 6 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 d14/d14_test.go create mode 100644 d14/p1.go create mode 100644 d14/p2.go diff --git a/d14/d14_test.go b/d14/d14_test.go new file mode 100644 index 0000000..0c04d9d --- /dev/null +++ b/d14/d14_test.go @@ -0,0 +1,53 @@ +package d14 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestP1(t *testing.T) { + result := P1(`NNCB + +CH -> B +HH -> N +CB -> H +NH -> C +HB -> C +HC -> B +HN -> C +NN -> C +BH -> H +NC -> B +NB -> B +BN -> B +BB -> N +BC -> B +CC -> N +CN -> C`) + + assert.EqualValues(t, 1588, result) +} + +func TestP2(t *testing.T) { + result := P2(`NNCB + +CH -> B +HH -> N +CB -> H +NH -> C +HB -> C +HC -> B +HN -> C +NN -> C +BH -> H +NC -> B +NB -> B +BN -> B +BB -> N +BC -> B +CC -> N +CN -> C`) + + assert.EqualValues(t, 2188189693529, result) +} diff --git a/d14/p1.go b/d14/p1.go new file mode 100644 index 0000000..a4848c6 --- /dev/null +++ b/d14/p1.go @@ -0,0 +1,68 @@ +package d14 + +import ( + "strings" + + "golang.org/x/exp/maps" + "golang.org/x/exp/slices" +) + +func reduce[S any, A any](slice []S, f func(elm S, acc A) A, acc A) A { + for _, elm := range slice { + acc = f(elm, acc) + } + return acc +} + +func makePairs(template string) map[string]int { + pairs := make(map[string]int) + + for i := 0; i < len(template)-1; i++ { + pairs[string(template[i])+string(template[i+1])] = 1 + } + + return pairs +} + +func templateAndInstructions(in string) (string, map[string]string) { + parts := strings.Split(strings.TrimSpace(in), "\n\n") + instructions := make(map[string]string) + for _, pair := range strings.Split(parts[1], "\n") { + mapping := strings.Split(pair, " -> ") + instructions[mapping[0]] = mapping[1] + } + return parts[0], instructions +} + +func count(template string, instructions map[string]string, runs int) map[string]int { + init := func(char string, acc map[string]int) map[string]int { acc[char]++; return acc } + counts := reduce(strings.Split(template, ""), init, make(map[string]int)) + pairs := makePairs(template) + for i := 0; i < runs; i++ { + for pair, count := range maps.Clone(pairs) { + left := pair[:1] + right := pair[1:] + middle := instructions[pair] + pairs[pair] -= count + pairs[left+middle] += count + pairs[middle+right] += count + counts[middle] += count + } + } + + return counts +} + +func countPolymer(in string, runs int) int { + template, instructions := templateAndInstructions(in) + counts := maps.Values(count(template, instructions, runs)) + slices.Sort(counts) + max := counts[len(counts)-1] + min := counts[0] + + return max - min +} + +func P1(in string) int { + return countPolymer(in, 10) +} diff --git a/d14/p2.go b/d14/p2.go new file mode 100644 index 0000000..48044ca --- /dev/null +++ b/d14/p2.go @@ -0,0 +1,5 @@ +package d14 + +func P2(in string) int { + return countPolymer(in, 40) +} diff --git a/go.mod b/go.mod index 3a61fd5..3642bf6 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,12 @@ module github.com/fotonmoton/aoc2021 -go 1.17 +go 1.18 + +require github.com/stretchr/testify v1.7.0 require ( github.com/davecgh/go-spew v1.1.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/stretchr/testify v1.7.0 // indirect + golang.org/x/exp v0.0.0-20220428152302-39d4317da171 // indirect gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect ) diff --git a/go.sum b/go.sum index b380ae4..34363e9 100644 --- a/go.sum +++ b/go.sum @@ -5,6 +5,9 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +golang.org/x/exp v0.0.0-20220428152302-39d4317da171 h1:TfdoLivD44QwvssI9Sv1xwa5DcL5XQr4au4sZ2F2NV4= +golang.org/x/exp v0.0.0-20220428152302-39d4317da171/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go index 9aa0020..abd4fee 100644 --- a/main.go +++ b/main.go @@ -12,6 +12,7 @@ import ( "github.com/fotonmoton/aoc2021/d11" "github.com/fotonmoton/aoc2021/d12" "github.com/fotonmoton/aoc2021/d13" + "github.com/fotonmoton/aoc2021/d14" "github.com/fotonmoton/aoc2021/d2" "github.com/fotonmoton/aoc2021/d3" "github.com/fotonmoton/aoc2021/d4" @@ -58,4 +59,6 @@ func main() { fmt.Printf("day 12 part 2: %v\n", d12.P2(client.Day(12))) fmt.Printf("day 13: %v\n", d13.P1(client.Day(13))) fmt.Printf("day 13 part 2: %v\n", d13.P2(client.Day(13))) + fmt.Printf("day 14: %v\n", d14.P1(client.Day(14))) + fmt.Printf("day 14 part 2: %v\n", d14.P2(client.Day(14))) }