github.com/agrigoryan/aoc_2023_go@v0.0.0-20231216221323-4ace361ec685/day12/d12p1.go (about) 1 package day12 2 3 import ( 4 "log" 5 "strconv" 6 "strings" 7 8 "github.com/agrigoryan/aoc_2023_go/aocutils" 9 ) 10 11 func solveLine(springs string, series []int) int { 12 stack := []string{springs} 13 sum := 0 14 for len(stack) > 0 { 15 s := stack[len(stack)-1] 16 stack = stack[:len(stack)-1] 17 18 countDamaged := 0 19 seriesIdx := 0 20 shouldContinue := false 21 for i, r := range s { 22 if r == '#' { 23 countDamaged += 1 24 } 25 if r == '.' && countDamaged > 0 { 26 if seriesIdx >= len(series) || countDamaged != series[seriesIdx] { 27 shouldContinue = true 28 break 29 } 30 seriesIdx += 1 31 countDamaged = 0 32 } 33 if r == '?' { 34 stack = append(stack, s[:i]+"."+s[i+1:]) 35 stack = append(stack, s[:i]+"#"+s[i+1:]) 36 shouldContinue = true 37 break 38 } 39 } 40 41 if shouldContinue { 42 continue 43 } 44 45 if countDamaged > 0 { 46 if seriesIdx >= len(series) || countDamaged != series[seriesIdx] { 47 continue 48 } 49 seriesIdx += 1 50 } 51 52 if seriesIdx != len(series) { 53 continue 54 } 55 56 sum += 1 57 } 58 59 return sum 60 } 61 62 func d12p1(input string) int { 63 lines := strings.Split(input, "\n") 64 65 sum := 0 66 for _, line := range lines { 67 parts := strings.Split(line, " ") 68 springs := parts[0] 69 series := aocutils.Map(strings.Split(parts[1], ","), func(s string) int { 70 res, err := strconv.Atoi(s) 71 if err != nil { 72 log.Fatalln(err) 73 } 74 return res 75 }) 76 sum += solveLine(springs, series) 77 } 78 79 return sum 80 }