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/day16"
|
||||||
"aoc2015/day17"
|
"aoc2015/day17"
|
||||||
"aoc2015/day18"
|
"aoc2015/day18"
|
||||||
|
"aoc2015/day19"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
@ -54,6 +55,7 @@ func initDayFunctions() {
|
|||||||
16: {1: day16.Part1, 2: day16.Part2},
|
16: {1: day16.Part1, 2: day16.Part2},
|
||||||
17: {1: day17.Part1, 2: day17.Part2},
|
17: {1: day17.Part1, 2: day17.Part2},
|
||||||
18: {1: day18.Part1, 2: day18.Part2},
|
18: {1: day18.Part1, 2: day18.Part2},
|
||||||
|
19: {1: day19.Part1, 2: day19.Part2},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user