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  }