day19, but p2 still needs work (bruteforce surprisingly doesn't work)

This commit is contained in:
Stefan Harmuth 2020-12-30 17:23:22 +01:00
parent 9e7e470498
commit 102b600131
4 changed files with 158 additions and 0 deletions

104
day19/day.go Normal file
View File

@ -0,0 +1,104 @@
package day19
import (
"strings"
"tools"
)
func Part1(puzzle tools.AoCPuzzle) interface{} {
input := puzzle.GetInputArray()
molecule := input[len(input)-1]
replacementStrings := input[:len(input)-2]
outcomes := tools.NewSet()
for _, line := range replacementStrings {
parts := strings.Split(line, " => ")
doubleChar := len(parts[0]) == 2
var result string
for i, c := range molecule {
if doubleChar && i == len(molecule)-1 {
break
}
if doubleChar {
if byte(c) == parts[0][0] && molecule[i+1] == parts[0][1] {
result = molecule[:i] + parts[1]
if i < len(molecule)-2 {
result += molecule[i+2:]
}
outcomes.Add(result)
}
} else {
if string(c) == parts[0] {
result = molecule[:i] + parts[1]
if i < len(molecule)-1 {
result += molecule[i+1:]
}
outcomes.Add(result)
}
}
}
}
return len(outcomes)
}
func getPossibleTransformations(from tools.Set, replacments map[string]tools.Set, maxLen int) tools.Set {
returnSet := tools.NewSet()
var result string
for interfaceMolecule := range from {
currentMolecule := interfaceMolecule.(string)
for i := range currentMolecule {
if transSet, ok := replacments[string(currentMolecule[i])]; ok {
for replacement := range transSet {
result = currentMolecule[:i] + replacement.(string)
if i < len(currentMolecule)-1 {
result += currentMolecule[i+1:]
}
if len(result) <= maxLen {
returnSet.Add(result)
}
}
}
if i < len(currentMolecule)-1 {
if transSet, ok := replacments[currentMolecule[i:i+2]]; ok {
for replacment := range transSet {
result = currentMolecule[:i] + replacment.(string)
if i < len(currentMolecule)-2 {
result += currentMolecule[i+2:]
}
if len(result) <= maxLen {
returnSet.Add(result)
}
}
}
}
}
}
return returnSet
}
func Part2(puzzle tools.AoCPuzzle) interface{} {
input := puzzle.GetInputArray()
molecule := input[len(input)-1]
replacementStrings := input[:len(input)-2]
replacements := make(map[string]tools.Set)
for _, line := range replacementStrings {
parts := strings.Split(line, " => ")
if _, ok := replacements[parts[0]]; !ok {
replacements[parts[0]] = tools.NewSet()
}
replacements[parts[0]].Add(parts[1])
}
currentMolecules := tools.NewSet()
currentMolecules.Add("e")
transformCount := 0
for !currentMolecules.Contains(molecule) {
transformCount++
currentMolecules = getPossibleTransformations(currentMolecules, replacements, len(molecule))
}
return transformCount
}

45
inputs/19 Normal file
View File

@ -0,0 +1,45 @@
Al => ThF
Al => ThRnFAr
B => BCa
B => TiB
B => TiRnFAr
Ca => CaCa
Ca => PB
Ca => PRnFAr
Ca => SiRnFYFAr
Ca => SiRnMgAr
Ca => SiTh
F => CaF
F => PMg
F => SiAl
H => CRnAlAr
H => CRnFYFYFAr
H => CRnFYMgAr
H => CRnMgYFAr
H => HCa
H => NRnFYFAr
H => NRnMgAr
H => NTh
H => OB
H => ORnFAr
Mg => BF
Mg => TiMg
N => CRnFAr
N => HSi
O => CRnFYFAr
O => CRnMgAr
O => HP
O => NRnFAr
O => OTi
P => CaP
P => PTi
P => SiRnFAr
Si => CaSi
Th => ThCa
Ti => BP
Ti => TiTi
e => HF
e => NAl
e => OMg
CRnSiRnCaPTiMgYCaPTiRnFArSiThFArCaSiThSiThPBCaCaSiRnSiRnTiTiMgArPBCaPMgYPTiRnFArFArCaSiRnBPMgArPRnCaPTiRnFArCaSiThCaCaFArPBCaCaPTiTiRnFArCaSiRnSiAlYSiThRnFArArCaSiRnBFArCaCaSiRnSiThCaCaCaFYCaPTiBCaSiThCaSiThPMgArSiRnCaPBFYCaCaFArCaCaCaCaSiThCaSiRnPRnFArPBSiThPRnFArSiRnMgArCaFYFArCaSiRnSiAlArTiTiTiTiTiTiTiRnPMgArPTiTiTiBSiRnSiAlArTiTiRnPMgArCaFYBPBPTiRnSiRnMgArSiThCaFArCaSiThFArPRnFArCaSiRnTiBSiThSiRnSiAlYCaFArPRnFArSiThCaFArCaCaSiThCaCaCaSiRnPRnCaFArFYPMgArCaPBCaPBSiRnFYPBCaFArCaSiAl

7
inputs/19_test Normal file
View File

@ -0,0 +1,7 @@
e => H
e => Oi
H => HOi
H => OiH
Oi => HH
HOiHOiHOi

View File

@ -19,6 +19,7 @@ import (
"aoc2015/day16"
"aoc2015/day17"
"aoc2015/day18"
"aoc2015/day19"
"flag"
"fmt"
"os"
@ -54,6 +55,7 @@ func initDayFunctions() {
16: {1: day16.Part1, 2: day16.Part2},
17: {1: day17.Part1, 2: day17.Part2},
18: {1: day18.Part1, 2: day18.Part2},
19: {1: day19.Part1, 2: day19.Part2},
}
}