diff options
Diffstat (limited to '2021/day-08/day-08.rkt')
-rw-r--r-- | 2021/day-08/day-08.rkt | 77 |
1 files changed, 29 insertions, 48 deletions
diff --git a/2021/day-08/day-08.rkt b/2021/day-08/day-08.rkt index ff54817..6476eae 100644 --- a/2021/day-08/day-08.rkt +++ b/2021/day-08/day-08.rkt @@ -1,67 +1,48 @@ #lang racket (require threading - awesome-list + list-utils "../../jj-aoc.rkt") (struct trial-data (signal output) #:transparent) (define (string->sets s) - (~> s - string-split - (map (λ~> string->list - list->set) _))) + (~> s string-split (map (λ~> string->list list->set) _))) (define data - (for/list ([l (in-lines (open-day 8))] - #:unless (equal? l "")) - (~> l - (string-split _ " | ") - (map string->sets _) - (apply trial-data _)))) + (for/list ([l (in-lines (open-day 8))] #:unless (equal? l "")) + (~> l (string-split _ " | ") (map string->sets _) (apply trial-data _)))) ;; part 1 -(for*/sum ([trial (in-list data)] - [output (in-list (trial-data-output trial))] - #:when (ormap (λ~> (= (set-count output))) '(2 3 4 7))) - 1) +(for*/sum ([trial (in-list data)] [output (in-list (trial-data-output trial))] + #:when (ormap (λ~> (= (set-count output))) '(2 3 4 7))) + 1) ;; part 2 (define (matching-pattern len trial) (define solution-set - (for*/list ([signal (in-list (trial-data-signal trial))] - #:when (= (set-count signal) len)) + (for*/list ([signal (in-list (trial-data-signal trial))] #:when (= (set-count signal) len)) signal)) (match solution-set [(list s) s] [s (apply set-intersect s)])) (define (determine-arrangement t) - (let* - ([pattern-1 (matching-pattern 2 t)] - [pattern-4 (matching-pattern 4 t)] - [pattern-7 (matching-pattern 3 t)] - [pattern-8 (matching-pattern 7 t)] - [pattern-shared-235 (matching-pattern 5 t)] - [pattern-3 (set-union pattern-1 - pattern-shared-235)] - [pattern-9 (set-union pattern-4 - pattern-shared-235)] - [pattern-shared-069 (matching-pattern 6 t)] - [pattern-just-f (set-subtract pattern-shared-069 pattern-shared-235)] - [pattern-just-e (set-subtract pattern-8 - (set-union pattern-4 - pattern-shared-235 - pattern-shared-069))] - [pattern-2 (set-union (set-subtract pattern-3 pattern-just-f) - pattern-just-e)] - [pattern-just-c (set-subtract (set-intersect pattern-4 pattern-7) - pattern-just-f)] - [pattern-6 (set-subtract pattern-8 pattern-just-c)] - [pattern-5 (set-subtract pattern-6 pattern-just-e)] - [pattern-0 (set-union (set-subtract pattern-8 - pattern-shared-235) - pattern-shared-069)] - ) + (let* ([pattern-1 (matching-pattern 2 t)] + [pattern-4 (matching-pattern 4 t)] + [pattern-7 (matching-pattern 3 t)] + [pattern-8 (matching-pattern 7 t)] + [pattern-shared-235 (matching-pattern 5 t)] + [pattern-3 (set-union pattern-1 pattern-shared-235)] + [pattern-9 (set-union pattern-4 pattern-shared-235)] + [pattern-shared-069 (matching-pattern 6 t)] + [pattern-just-f (set-subtract pattern-shared-069 pattern-shared-235)] + [pattern-just-e + (set-subtract pattern-8 (set-union pattern-4 pattern-shared-235 pattern-shared-069))] + [pattern-2 (set-union (set-subtract pattern-3 pattern-just-f) pattern-just-e)] + [pattern-just-c (set-subtract (set-intersect pattern-4 pattern-7) pattern-just-f)] + [pattern-6 (set-subtract pattern-8 pattern-just-c)] + [pattern-5 (set-subtract pattern-6 pattern-just-e)] + [pattern-0 (set-union (set-subtract pattern-8 pattern-shared-235) pattern-shared-069)]) (~> (list pattern-0 pattern-1 pattern-2 @@ -76,8 +57,8 @@ make-hash))) (for/sum ([trial (in-list data)]) - (~>> trial - trial-data-output - (map (λ~>> (hash-ref (determine-arrangement trial)))) - (apply ~a) - string->number)) + (~>> trial + trial-data-output + (map (λ~>> (hash-ref (determine-arrangement trial)))) + (apply ~a) + string->number)) |