diff options
Diffstat (limited to 'aoc2023-other/day-12/day-12.rkt')
-rw-r--r-- | aoc2023-other/day-12/day-12.rkt | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/aoc2023-other/day-12/day-12.rkt b/aoc2023-other/day-12/day-12.rkt index f7d303c..d07994f 100644 --- a/aoc2023-other/day-12/day-12.rkt +++ b/aoc2023-other/day-12/day-12.rkt @@ -16,22 +16,24 @@ (do-count template spring-group left-in-group need-gap?) ;; template: list of spring positions ;; spring-group: list of remaining contiguous groups of damaged springs - ;; left-in-group: springs remaining in current spring group being placed - ;; need-gap?: did we just finish placing a spring group + ;; left-in-group: springs remaining in current bad spring group being placed + ;; need-gap?: did we just finish placing a bad spring group ;; and need at least one undamaged spring before starting the next one? (match (list template spring-group left-in-group need-gap?) - ;; no gears left to place, this is an OK arrangement, count it + ;; no springs left to place and no places left to place springs + ;; this is an OK arrangement, count it [(list '() '() 0 _) 1] - ;; ambiguous wildcard, try both skipping this spot and starting a gear group here + ;; ambiguous wildcard, try both skipping this spot and starting a damaged spring group here [(list (list* #\? t-rest) (list* g g-rest) 0 #f) (+ (do-count t-rest g-rest (sub1 g) (= g 1)) (do-count t-rest spring-group 0 #f))] - ;; definitely a place for a good spring (.); move on without consuming any spring groups - [(or (list (list* #\? t-rest) '() 0 #f) - (list (list* #\? t-rest) _ 0 #t) - (list (list* #\. t-rest) _ 0 _)) + ;; definitely a place for a good spring (.), move on without consuming any spring groups + [(or (list (list* #\? t-rest) '() 0 #f) ; good spring, no more damaged springs to place + (list (list* #\? t-rest) _ 0 #t) ; good spring right after finishing a group of bad springs + (list (list* #\. t-rest) _ 0 _)) ; known good spring (do-count t-rest spring-group 0 #f)] - ;; definitely a place for a damaged spring (#); use the next spring group and remove 1 from it + ;; start of bad spring (#) group, use the next spring group and remove 1 from it [(list (list* #\# t-rest) (list* g g-rest) 0 #f) (do-count t-rest g-rest (sub1 g) (= g 1))] + ;; continuation of bad spring group, same [(list (list* (or #\? #\#) t-rest) g left #f) (do-count t-rest g (sub1 left) (= left 1))] ;; if nothing above works, this arrangement's invalid [_ 0])) |