day19, but p2 still needs work (bruteforce surprisingly doesn't work)
This commit is contained in:
parent
9e7e470498
commit
102b600131
104
day19/day.go
Normal file
104
day19/day.go
Normal 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
45
inputs/19
Normal 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
7
inputs/19_test
Normal file
@ -0,0 +1,7 @@
|
||||
e => H
|
||||
e => Oi
|
||||
H => HOi
|
||||
H => OiH
|
||||
Oi => HH
|
||||
|
||||
HOiHOiHOi
|
||||
2
main.go
2
main.go
@ -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},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user