Day 17 part 2...sort of

It works for one of my account's inputs, but not the other. At least the foundation is in place...just need to fix the heuristics for determining which subsets to hang onto.

I also desperately need to clean up this code as I was writing it just to get stuff working and not thinking about actual structure.
This commit is contained in:
2022-06-14 00:28:14 -05:00
parent ada450ef97
commit 3ff5e90e81

View File

@ -272,5 +272,65 @@ func (d *Day17) Part2() string {
instructions = append(instructions, fmt.Sprintf("%d", numMoved))
}
return fmt.Sprintf("%s%s%s", u.TextBold, strings.Join(instructions, ","), u.TextReset)
workingInstructions := make([]string, len(instructions))
copy(workingInstructions, instructions)
instructionStr := strings.Join(workingInstructions, ",")
progs := make([][]string, 3)
for i := 0; i < 3; i++ {
numFound := 3
subLen := 4
for numFound >= 3 {
numFound = 0
instructionSubset := strings.Join(workingInstructions[0:subLen], ",")
for x := 0; x <= len(instructionStr)-len(instructionSubset); x++ {
if instructionStr[x:x+len(instructionSubset)] == instructionSubset {
numFound++
}
}
if numFound >= 3 {
subLen += 2
}
}
if numFound < 3 {
subLen -= 2
}
progs[i] = make([]string, subLen)
copy(progs[i], workingInstructions[0:subLen])
instructionStr = strings.ReplaceAll(instructionStr, strings.Join(progs[i], ","), "")
instructionStr = strings.TrimPrefix(strings.ReplaceAll(instructionStr, ",,", ","), ",")
if len(instructionStr) == 0 {
workingInstructions = nil
} else {
workingInstructions = strings.Split(instructionStr, ",")
}
}
if workingInstructions != nil {
panic("didn't empty instructions")
}
instructionStr = strings.Join(instructions, ",")
instructionStr = strings.ReplaceAll(instructionStr, strings.Join(progs[0], ","), "A")
instructionStr = strings.ReplaceAll(instructionStr, strings.Join(progs[1], ","), "B")
instructionStr = strings.ReplaceAll(instructionStr, strings.Join(progs[2], ","), "C")
instructionStr = fmt.Sprintf("%s\n%s\n%s\n%s\nn\n",
instructionStr,
strings.Join(progs[0], ","),
strings.Join(progs[1], ","),
strings.Join(progs[2], ","),
)
d.program.Reset()
d.program.SetMemory(0, 2)
dustCollected := int64(0)
d.program.RunIn(func(inputStep int) int64 {
return int64(instructionStr[inputStep-1])
}, func(val int64, state u.IntcodeProgramState) {
dustCollected = val
})
return fmt.Sprintf("Dust collected after traveling all paths: %s%d%s", u.TextBold, dustCollected, u.TextReset)
}