diff options
Diffstat (limited to 'aoc2023-racket/day-12/day-12.rkt')
-rw-r--r-- | aoc2023-racket/day-12/day-12.rkt | 65 |
1 files changed, 0 insertions, 65 deletions
diff --git a/aoc2023-racket/day-12/day-12.rkt b/aoc2023-racket/day-12/day-12.rkt deleted file mode 100644 index 50b14bb..0000000 --- a/aoc2023-racket/day-12/day-12.rkt +++ /dev/null @@ -1,65 +0,0 @@ -#lang racket - -(require advent-of-code - threading - memo) - -(struct condition (template spring-set)) - -(define conditions - (for/list ([line (in-lines (open-aoc-input (find-session) 2023 12 #:cache #true))]) - (match (string-split line #px"[ ,]") - [(list* template spring-set) - (condition (string->list template) (map string->number spring-set))]))) - -(define/memoize (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 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* (template spring-group left-in-group need-gap?) - ;; no springs left to place and no places left to place springs - ;; this is an OK arrangement, count it - [('() '() 0 _) 1] - ;; ambiguous wildcard, try both skipping this spot and starting a damaged spring group here - [((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 - [((list* #\? t-rest) '() 0 #f) ; good spring, no more damaged springs to place - (do-count t-rest spring-group 0 #f)] - [((list* #\? t-rest) _ 0 #t) ; good spring right after finishing a group of bad springs - (do-count t-rest spring-group 0 #f)] - [((list* #\. t-rest) _ 0 _) ; known good spring - (do-count t-rest spring-group 0 #f)] - ;; start of bad spring (#) group, use the next spring group and remove 1 from it - [((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* (or #\? #\#) t-rest) g left #f) (do-count t-rest g (sub1 left) (= left 1))] - ;; if nothing above works, this arrangement's invalid - [(_ _ _ _) 0])) - -(define (count-solutions c) - (match-define (condition template spring-set) c) - (do-count template spring-set 0 #f)) - -;; part 1 -(for/sum ([c (in-list conditions)]) - (count-solutions c)) - -;; part 2 -(define expanded-conditions - (for/list ([c (in-list conditions)]) - (condition (~> c - condition-template - (make-list 5 _) - (add-between #\?) - flatten) - (~> c - condition-spring-set - (make-list 5 _) - flatten)))) - -(for/sum ([c* (in-list expanded-conditions)]) - (count-solutions c*)) |