day12, part1
This commit is contained in:
parent
cdf5a38512
commit
c187a03076
|
@ -11,16 +11,28 @@ import (
|
||||||
func Run() int {
|
func Run() int {
|
||||||
fmt.Println("hello day 12.")
|
fmt.Println("hello day 12.")
|
||||||
|
|
||||||
filename := "day12/example1"
|
filename := "day12/input"
|
||||||
bytes, err := os.ReadFile(filename)
|
bytes, err := os.ReadFile(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Sprintf("error reading file %s\n", filename))
|
panic(fmt.Sprintf("error reading file %s\n", filename))
|
||||||
}
|
}
|
||||||
|
|
||||||
sum := 0
|
result := 0
|
||||||
text := string(bytes)
|
text := string(bytes)
|
||||||
text = strings.TrimSpace(text)
|
text = strings.TrimSpace(text)
|
||||||
|
|
||||||
|
// testMask := "???????#??.????####?"
|
||||||
|
// testBlocks := []int{1, 1, 1, 1, 1, 6}
|
||||||
|
// blocksSum := 0
|
||||||
|
// for _, block := range testBlocks {
|
||||||
|
// blocksSum += block
|
||||||
|
// }
|
||||||
|
// testVariants := generatePermutations("", len(testMask), testBlocks, blocksSum, testMask)
|
||||||
|
// fmt.Printf("for mask %s and blocks %+v\n", testMask, testBlocks)
|
||||||
|
// for _, variant := range testVariants {
|
||||||
|
// fmt.Println(variant)
|
||||||
|
// }
|
||||||
|
|
||||||
for _, line := range strings.Split(text, "\n") {
|
for _, line := range strings.Split(text, "\n") {
|
||||||
mask, blockLengs := ReadLine(line)
|
mask, blockLengs := ReadLine(line)
|
||||||
|
|
||||||
|
@ -35,11 +47,11 @@ func Run() int {
|
||||||
for range variants {
|
for range variants {
|
||||||
match += 1
|
match += 1
|
||||||
}
|
}
|
||||||
log.Printf("for line %s blocks %+v matches %d\n", mask, blockLengs, match)
|
fmt.Printf("for line %s blocks %+v matches %d\n", mask, blockLengs, match)
|
||||||
sum += match
|
result += match
|
||||||
}
|
}
|
||||||
|
|
||||||
return sum
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// ???.### 1,1,3
|
// ???.### 1,1,3
|
||||||
|
@ -64,36 +76,37 @@ func ReadLine(line string) (string, []int) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func generatePermutations(curString string, targetLength int, blockLengths []int, blockLengthsSum int, mask string) []string {
|
func generatePermutations(curString string, targetLength int, blockLengths []int, blockLengthsSum int, mask string) []string {
|
||||||
if !isVariantMatchesMask(curString, mask) {
|
|
||||||
return []string{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// log.Printf("> entering with %s\n", curString)
|
// log.Printf("> entering with %s\n", curString)
|
||||||
if len(blockLengths) == 0 {
|
if len(blockLengths) == 0 {
|
||||||
if len(curString) > targetLength {
|
if len(curString) > targetLength {
|
||||||
return []string{}
|
return []string{}
|
||||||
}
|
}
|
||||||
variant := curString + strings.Repeat(".", targetLength - len(curString))
|
variant := curString + strings.Repeat(".", targetLength-len(curString))
|
||||||
|
if !isVariantMatchesMask(variant, mask) {
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
return []string{variant}
|
return []string{variant}
|
||||||
}
|
}
|
||||||
|
|
||||||
nextBlock := blockLengths[0]
|
nextBlock := blockLengths[0]
|
||||||
restBlocks := blockLengths[1:]
|
restBlocks := blockLengths[1:]
|
||||||
|
|
||||||
if len(curString) + blockLengthsSum > targetLength {
|
if len(curString)+blockLengthsSum > targetLength {
|
||||||
return []string{}
|
return []string{}
|
||||||
}
|
}
|
||||||
|
|
||||||
isLast := len(restBlocks) == 0
|
isLast := len(restBlocks) == 0
|
||||||
rightPointRepeat := 1
|
rightPointRepeat := 1
|
||||||
if isLast {
|
if isLast {
|
||||||
rightPointRepeat = 0 }
|
rightPointRepeat = 0
|
||||||
|
}
|
||||||
|
|
||||||
whenPass := curString + "."
|
whenPass := curString + "."
|
||||||
whenAdd := curString + strings.Repeat("#", nextBlock) + strings.Repeat(".", rightPointRepeat)
|
whenAdd := curString + strings.Repeat("#", nextBlock) + strings.Repeat(".", rightPointRepeat)
|
||||||
|
|
||||||
variantsWhenPass := generatePermutations(whenPass, targetLength, blockLengths, blockLengthsSum, mask)
|
variantsWhenPass := generatePermutations(whenPass, targetLength, blockLengths, blockLengthsSum, mask)
|
||||||
variantsWhenAdd := generatePermutations(whenAdd, targetLength, restBlocks, blockLengthsSum - nextBlock, mask)
|
variantsWhenAdd := generatePermutations(whenAdd, targetLength, restBlocks, blockLengthsSum-nextBlock, mask)
|
||||||
|
|
||||||
return append(variantsWhenAdd, variantsWhenPass...)
|
return append(variantsWhenAdd, variantsWhenPass...)
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -6,3 +6,89 @@ i take length of the mask, that's max size
|
||||||
then for each step, either put . or put n # from the input.
|
then for each step, either put . or put n # from the input.
|
||||||
|
|
||||||
add to current string, and do 2 recursive calls, one with diminished 'queue', one with same
|
add to current string, and do 2 recursive calls, one with diminished 'queue', one with same
|
||||||
|
* wrong answer on input
|
||||||
|
it's too high
|
||||||
|
|
||||||
|
and log shows:
|
||||||
|
|
||||||
|
2023/12/12 15:07:52 for line ???#?.?#?#.?#???#..? blocks [4 4 5 1] matches 2
|
||||||
|
|
||||||
|
and it should be 0
|
||||||
|
** huh, nope this looks good:
|
||||||
|
testMask := "???#?.?#?#.?#???#..?"
|
||||||
|
testBlocks := []int{4,4,5,1}
|
||||||
|
testVariants := generatePermutations("", len(testMask), testBlocks, 14, testMask)
|
||||||
|
fmt.Printf("for mask %s and blocks %+v\n", testMask, testBlocks)
|
||||||
|
fmt.Println(testVariants)
|
||||||
|
|
||||||
|
for mask ???#?.?#?#.?#???#..? and blocks [4 4 5 1]
|
||||||
|
[####..####..#####..# .####.####..#####..#]
|
||||||
|
** let's check this : for line ??????#???????? blocks [7 2] matches 21
|
||||||
|
** or this for line ?????.??#????? blocks [3 3 2 1] matches 3
|
||||||
|
looks ok
|
||||||
|
** this for line ??..??#?????#?##? blocks [1 1 1 1 4] matches 15
|
||||||
|
looks good
|
||||||
|
** for line ?#??#??#???.??.??.? blocks [1 2 3 1 1 1] matches 20
|
||||||
|
seems ok
|
||||||
|
** for line ???????#??.????####? blocks [1 1 1 1 1 6] matches 58
|
||||||
|
bingo?
|
||||||
|
|
||||||
|
for mask ???????#??.????####? and blocks [1 1 1 1 1 6]
|
||||||
|
#.#.#..#.#.######...
|
||||||
|
#.#.#..#.#..######..
|
||||||
|
#.#.#..#.#...######.
|
||||||
|
#.#.#..#.#....######
|
||||||
|
#.#.#..#...#.######.
|
||||||
|
#.#.#..#...#..######
|
||||||
|
#.#.#..#....#.######
|
||||||
|
#.#..#.#.#.######...
|
||||||
|
#.#..#.#.#..######..
|
||||||
|
#.#..#.#.#...######.
|
||||||
|
#.#..#.#.#....######
|
||||||
|
#.#..#.#...#.######.
|
||||||
|
#.#..#.#...#..######
|
||||||
|
#.#..#.#....#.######
|
||||||
|
#.#....#.#.#.######.
|
||||||
|
#.#....#.#.#..######
|
||||||
|
#.#....#.#..#.######
|
||||||
|
#..#.#.#.#.######...
|
||||||
|
#..#.#.#.#..######..
|
||||||
|
#..#.#.#.#...######.
|
||||||
|
#..#.#.#.#....######
|
||||||
|
#..#.#.#...#.######.
|
||||||
|
#..#.#.#...#..######
|
||||||
|
#..#.#.#....#.######
|
||||||
|
#..#...#.#.#.######.
|
||||||
|
#..#...#.#.#..######
|
||||||
|
#..#...#.#..#.######
|
||||||
|
#...#..#.#.#.######.
|
||||||
|
#...#..#.#.#..######
|
||||||
|
#...#..#.#..#.######
|
||||||
|
#....#.#.#.#.######.
|
||||||
|
#....#.#.#.#..######
|
||||||
|
#....#.#.#..#.######
|
||||||
|
.#.#.#.#.#.######...
|
||||||
|
.#.#.#.#.#..######..
|
||||||
|
.#.#.#.#.#...######.
|
||||||
|
.#.#.#.#.#....######
|
||||||
|
.#.#.#.#...#.######.
|
||||||
|
.#.#.#.#...#..######
|
||||||
|
.#.#.#.#....#.######
|
||||||
|
.#.#...#.#.#.######.
|
||||||
|
.#.#...#.#.#..######
|
||||||
|
.#.#...#.#..#.######
|
||||||
|
.#..#..#.#.#.######.
|
||||||
|
.#..#..#.#.#..######
|
||||||
|
.#..#..#.#..#.######
|
||||||
|
.#...#.#.#.#.######.
|
||||||
|
.#...#.#.#.#..######
|
||||||
|
.#...#.#.#..#.######
|
||||||
|
..#.#..#.#.#.######.
|
||||||
|
..#.#..#.#.#..######
|
||||||
|
..#.#..#.#..#.######
|
||||||
|
..#..#.#.#.#.######.
|
||||||
|
..#..#.#.#.#..######
|
||||||
|
..#..#.#.#..#.######
|
||||||
|
...#.#.#.#.#.######.
|
||||||
|
...#.#.#.#.#..######
|
||||||
|
...#.#.#.#..#.######
|
||||||
|
|
Loading…
Reference in New Issue