2021 - Day 14 (Improved implementation)

This commit is contained in:
Dreaded_X 2021-12-15 18:24:20 +01:00
parent 269c347c40
commit aa2b91dfb2

94
2021/14/improved.go Normal file
View File

@ -0,0 +1,94 @@
package main
import (
aoc "AoC/2021/common"
"bufio"
"strings"
)
func synthesis(input *bufio.Scanner, steps int) int {
// Read template
input.Scan()
polymer := input.Text()
// Skip empty line
input.Scan()
// Create the mapping
subs := make(map[string]string, 0)
for input.Scan() {
line := input.Text()
s := strings.Split(line, " ")
subs[s[0]] = s[2]
}
// Count the amount of each letter and pair in the template
pairs := make(map[string]int, 0)
counter := make(map[string]int, 0)
for i := 0; i < len(polymer); i++ {
if i < len(polymer)-1 {
pairs[string(polymer[i]) + string(polymer[i+1])]++
}
counter[string(polymer[i])]++
}
// Execute each step
for step := 1; step <= steps; step++ {
pairsNew := make(map[string]int, 0)
for p, c := range pairs {
// Each pair will form two new pairs after insertion
pairsNew[string(p[0]) + subs[p]] += c
pairsNew[subs[p] + string(p[1])] += c
counter[subs[p]] += c
}
pairs = pairsNew
}
min := -1
max := -1
for _, c := range counter {
if c < min || min == -1 {
min = c
}
if c > max || max == -1 {
max = c
}
}
return max - min
}
func main() {
challenge := aoc.New(2021, 14)
challenge.Test(`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`, []int{1588, 2188189693529})
challenge.Solution(1, func (input *bufio.Scanner) int {
return synthesis(input, 10)
})
challenge.Solution(2, func (input *bufio.Scanner) int {
return synthesis(input, 40)
})
}