2021 - Day 14 (Improved implementation)
This commit is contained in:
parent
269c347c40
commit
aa2b91dfb2
94
2021/14/improved.go
Normal file
94
2021/14/improved.go
Normal 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)
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user