Day 14
This commit is contained in:
parent
72b053def2
commit
8854ab7279
|
@ -0,0 +1,102 @@
|
||||||
|
FNFPPNKPPHSOKFFHOFOC
|
||||||
|
|
||||||
|
VS -> B
|
||||||
|
SV -> C
|
||||||
|
PP -> N
|
||||||
|
NS -> N
|
||||||
|
BC -> N
|
||||||
|
PB -> F
|
||||||
|
BK -> P
|
||||||
|
NV -> V
|
||||||
|
KF -> C
|
||||||
|
KS -> C
|
||||||
|
PV -> N
|
||||||
|
NF -> S
|
||||||
|
PK -> F
|
||||||
|
SC -> F
|
||||||
|
KN -> K
|
||||||
|
PN -> K
|
||||||
|
OH -> F
|
||||||
|
PS -> P
|
||||||
|
FN -> O
|
||||||
|
OP -> B
|
||||||
|
FO -> C
|
||||||
|
HS -> F
|
||||||
|
VO -> C
|
||||||
|
OS -> B
|
||||||
|
PF -> V
|
||||||
|
SB -> V
|
||||||
|
KO -> O
|
||||||
|
SK -> N
|
||||||
|
KB -> F
|
||||||
|
KH -> C
|
||||||
|
CC -> B
|
||||||
|
CS -> C
|
||||||
|
OF -> C
|
||||||
|
FS -> B
|
||||||
|
FP -> H
|
||||||
|
VN -> O
|
||||||
|
NB -> N
|
||||||
|
BS -> H
|
||||||
|
PC -> H
|
||||||
|
OO -> F
|
||||||
|
BF -> O
|
||||||
|
HC -> P
|
||||||
|
BH -> S
|
||||||
|
NP -> P
|
||||||
|
FB -> C
|
||||||
|
CB -> H
|
||||||
|
BO -> C
|
||||||
|
NN -> V
|
||||||
|
SF -> N
|
||||||
|
FC -> F
|
||||||
|
KK -> C
|
||||||
|
CN -> N
|
||||||
|
BV -> F
|
||||||
|
FK -> C
|
||||||
|
CF -> F
|
||||||
|
VV -> B
|
||||||
|
VF -> S
|
||||||
|
CK -> C
|
||||||
|
OV -> P
|
||||||
|
NC -> N
|
||||||
|
SS -> F
|
||||||
|
NK -> V
|
||||||
|
HN -> O
|
||||||
|
ON -> P
|
||||||
|
FH -> O
|
||||||
|
OB -> H
|
||||||
|
SH -> H
|
||||||
|
NH -> V
|
||||||
|
FF -> B
|
||||||
|
HP -> B
|
||||||
|
PO -> P
|
||||||
|
HB -> H
|
||||||
|
CH -> N
|
||||||
|
SN -> P
|
||||||
|
HK -> P
|
||||||
|
FV -> H
|
||||||
|
SO -> O
|
||||||
|
VH -> V
|
||||||
|
BP -> V
|
||||||
|
CV -> P
|
||||||
|
KP -> K
|
||||||
|
VB -> N
|
||||||
|
HV -> K
|
||||||
|
SP -> N
|
||||||
|
HO -> P
|
||||||
|
CP -> H
|
||||||
|
VC -> N
|
||||||
|
CO -> S
|
||||||
|
BN -> H
|
||||||
|
NO -> B
|
||||||
|
HF -> O
|
||||||
|
VP -> K
|
||||||
|
KV -> H
|
||||||
|
KC -> F
|
||||||
|
HH -> C
|
||||||
|
BB -> K
|
||||||
|
VK -> P
|
||||||
|
OK -> C
|
||||||
|
OC -> C
|
||||||
|
PH -> H
|
|
@ -0,0 +1,72 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"math"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
inputBytes, _ := os.ReadFile("input.txt")
|
||||||
|
input := strings.Split(string(inputBytes), "\n")
|
||||||
|
|
||||||
|
log.Println("Puzzle 1:", puzzle1(input))
|
||||||
|
log.Println("Puzzle 2:", puzzle2(input))
|
||||||
|
}
|
||||||
|
|
||||||
|
func puzzle1(input []string) int {
|
||||||
|
return do(input, 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
func puzzle2(input []string) int {
|
||||||
|
return do(input, 40)
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input []string) (template string, rules map[string]string) {
|
||||||
|
template = input[0]
|
||||||
|
rules = map[string]string{}
|
||||||
|
for _, line := range input[2:] {
|
||||||
|
parts := strings.Split(line, " -> ")
|
||||||
|
rules[parts[0]] = parts[1]
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func do(input []string, steps int) int {
|
||||||
|
// Parse input
|
||||||
|
template, rules := parseInput(input)
|
||||||
|
// Polymerize
|
||||||
|
pairs := map[string]int{}
|
||||||
|
for i := 0; i < len(template)-1; i++ {
|
||||||
|
pairs[template[i:i+2]]++
|
||||||
|
}
|
||||||
|
for i := 0; i < steps; i++ {
|
||||||
|
newPairs := map[string]int{}
|
||||||
|
for pair, count := range pairs {
|
||||||
|
rule := rules[pair]
|
||||||
|
newPairs[pair[0:1]+rule] += count
|
||||||
|
newPairs[rule+pair[1:2]] += count
|
||||||
|
}
|
||||||
|
pairs = newPairs
|
||||||
|
}
|
||||||
|
// Sum up counts for each letter
|
||||||
|
counts := map[byte]int{}
|
||||||
|
for pair, count := range pairs {
|
||||||
|
counts[pair[0]] += count
|
||||||
|
}
|
||||||
|
// Add count for last letter in template
|
||||||
|
counts[template[len(template)-1]]++
|
||||||
|
// Get minimum and maximum counts
|
||||||
|
max, min := math.MinInt, math.MaxInt
|
||||||
|
for _, count := range counts {
|
||||||
|
if count > max {
|
||||||
|
max = count
|
||||||
|
}
|
||||||
|
if count < min {
|
||||||
|
min = count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Return difference
|
||||||
|
return max - min
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test(t *testing.T) {
|
||||||
|
inputBytes, _ := os.ReadFile("test.txt")
|
||||||
|
input := strings.Split(string(inputBytes), "\n")
|
||||||
|
|
||||||
|
assert.Equal(t, 1588, puzzle1(input))
|
||||||
|
assert.Equal(t, 2188189693529, puzzle2(input))
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
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
|
Reference in New Issue