diff --git a/day12/dayTwelve.go b/day12/dayTwelve.go index c6dc31e..bbf4abb 100644 --- a/day12/dayTwelve.go +++ b/day12/dayTwelve.go @@ -55,7 +55,8 @@ func Run() int { blockLengthSum += blockLen } - variantsCount := generatePermutations("", len(mask), blockLengs, blockLengthSum, mask) + memo := make(map[string]int) + variantsCount := generatePermutations("", len(mask), blockLengs, blockLengthSum, mask, memo) log.Printf("%d : for line %s blocks %+v matches %d\n", lineNum, mask, blockLengs, variantsCount) matches <- variantsCount @@ -115,7 +116,14 @@ func ReadLine(line string) (string, []int) { return mask, blockLengs } -func generatePermutations(curString string, targetLength int, blockLengths []int, blockLengthsSum int, mask string) int { +func generatePermutations(curString string, targetLength int, blockLengths []int, blockLengthsSum int, mask string, memo map[string]int) int { + + memoKey := fmt.Sprintf("%+v|%d", blockLengths, len(curString)) + memoized, memoFound := memo[memoKey] + if memoFound { + return memoized + } + // fmt.Printf("> entering with \n%s\nfor map \n%s\n\n", curString, mask) // time.Sleep(time.Second) if !isVariantMatchesMask(curString, mask) { @@ -131,6 +139,7 @@ func generatePermutations(curString string, targetLength int, blockLengths []int if !isVariantMatchesMask(variant, mask) { return 0 } + memo[memoKey] = 1 return 1 } @@ -150,9 +159,10 @@ func generatePermutations(curString string, targetLength int, blockLengths []int whenPass := curString + "." whenAdd := curString + strings.Repeat("#", nextBlock) + strings.Repeat(".", rightPointRepeat) - passCount := generatePermutations(whenPass, targetLength, blockLengths, blockLengthsSum, mask) - addCount := generatePermutations(whenAdd, targetLength, restBlocks, blockLengthsSum-nextBlock, mask) + passCount := generatePermutations(whenPass, targetLength, blockLengths, blockLengthsSum, mask, memo) + addCount := generatePermutations(whenAdd, targetLength, restBlocks, blockLengthsSum-nextBlock, mask, memo) + memo[memoKey] = passCount + addCount return passCount + addCount }