diff --git a/day19/day.go b/day19/day.go new file mode 100644 index 0000000..15d9700 --- /dev/null +++ b/day19/day.go @@ -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 +} diff --git a/inputs/19 b/inputs/19 new file mode 100644 index 0000000..e3001ec --- /dev/null +++ b/inputs/19 @@ -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 \ No newline at end of file diff --git a/inputs/19_test b/inputs/19_test new file mode 100644 index 0000000..7617b7a --- /dev/null +++ b/inputs/19_test @@ -0,0 +1,7 @@ +e => H +e => Oi +H => HOi +H => OiH +Oi => HH + +HOiHOiHOi \ No newline at end of file diff --git a/main.go b/main.go index e1a04f8..36747d0 100644 --- a/main.go +++ b/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}, } }