109 lines
2.3 KiB
Go
109 lines
2.3 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
|
||
|
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
||
|
)
|
||
|
|
||
|
var template string
|
||
|
var insertions map[string]string
|
||
|
|
||
|
func main() {
|
||
|
insertions = make(map[string]string)
|
||
|
inp := h.StdinToStringSlice()
|
||
|
template = inp[0]
|
||
|
for i := 2; i < len(inp); i++ {
|
||
|
pts := strings.Split(inp[i], " -> ")
|
||
|
insertions[pts[0]] = pts[1]
|
||
|
}
|
||
|
part1(template)
|
||
|
fmt.Println()
|
||
|
part2(template)
|
||
|
}
|
||
|
|
||
|
func transform(inp string) string {
|
||
|
var ret string
|
||
|
for i := 0; i < len(inp)-1; i++ {
|
||
|
pair := inp[i : i+2]
|
||
|
ret = ret + string(inp[i]) + insertions[pair]
|
||
|
}
|
||
|
ret = ret + string(inp[len(inp)-1])
|
||
|
return ret
|
||
|
}
|
||
|
|
||
|
func part1(inp string) {
|
||
|
for i := 0; i < 10; i++ {
|
||
|
inp = transform(inp)
|
||
|
}
|
||
|
countMap := make(map[byte]int)
|
||
|
for i := range inp {
|
||
|
countMap[inp[i]]++
|
||
|
}
|
||
|
var mostCommon, leastCommon byte
|
||
|
mostCount := h.MIN_INT
|
||
|
leastCount := h.MAX_INT
|
||
|
for k, v := range countMap {
|
||
|
if v > mostCount {
|
||
|
mostCount = v
|
||
|
mostCommon = k
|
||
|
}
|
||
|
if v < leastCount {
|
||
|
leastCount = v
|
||
|
leastCommon = k
|
||
|
}
|
||
|
}
|
||
|
fmt.Println("# Part 1")
|
||
|
fmt.Printf("Most Common: %s (%d)\n", string(mostCommon), mostCount)
|
||
|
fmt.Printf("Least Common: %s (%d)\n", string(leastCommon), leastCount)
|
||
|
fmt.Println("Answer", (mostCount - leastCount))
|
||
|
}
|
||
|
|
||
|
func part2Transform(pairs map[string]int) map[string]int {
|
||
|
ret := make(map[string]int)
|
||
|
for k, v := range pairs {
|
||
|
add := insertions[k]
|
||
|
p1, p2 := string(k[0])+add, add+string(k[1])
|
||
|
ret[p1] += v
|
||
|
ret[p2] += v
|
||
|
}
|
||
|
return ret
|
||
|
}
|
||
|
|
||
|
func part2(inp string) {
|
||
|
// So the obvious way doesn't work for this many steps.
|
||
|
// Let's try just dealing with pairs.
|
||
|
pairs := make(map[string]int)
|
||
|
for i := 0; i < len(inp)-1; i++ {
|
||
|
pair := inp[i : i+2]
|
||
|
pairs[pair]++
|
||
|
}
|
||
|
for i := 0; i < 40; i++ {
|
||
|
pairs = part2Transform(pairs)
|
||
|
}
|
||
|
countMap := make(map[byte]int)
|
||
|
for k, v := range pairs {
|
||
|
countMap[k[0]] = countMap[k[0]] + v
|
||
|
}
|
||
|
countMap[inp[len(inp)-1]]++
|
||
|
|
||
|
var mostCommon, leastCommon byte
|
||
|
mostCount := h.MIN_INT
|
||
|
leastCount := h.MAX_INT
|
||
|
for k, v := range countMap {
|
||
|
if v > mostCount {
|
||
|
mostCount = v
|
||
|
mostCommon = k
|
||
|
}
|
||
|
if v < leastCount {
|
||
|
leastCount = v
|
||
|
leastCommon = k
|
||
|
}
|
||
|
}
|
||
|
fmt.Println("# Part 2")
|
||
|
fmt.Printf("Most Common: %s (%d)\n", string(mostCommon), mostCount)
|
||
|
fmt.Printf("Least Common: %s (%d)\n", string(leastCommon), leastCount)
|
||
|
fmt.Println("Answer", (mostCount - leastCount))
|
||
|
}
|