diff options
Diffstat (limited to 'racket/aoc2021/day-08')
-rw-r--r-- | racket/aoc2021/day-08/day-08.rkt | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/racket/aoc2021/day-08/day-08.rkt b/racket/aoc2021/day-08/day-08.rkt new file mode 100644 index 0000000..6476eae --- /dev/null +++ b/racket/aoc2021/day-08/day-08.rkt @@ -0,0 +1,64 @@ +#lang racket +(require threading + list-utils + "../../jj-aoc.rkt") + +(struct trial-data (signal output) #:transparent) + +(define (string->sets s) + (~> 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 _)))) + +;; 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) + +;; part 2 +(define (matching-pattern len trial) + (define solution-set + (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)]) + (~> (list pattern-0 + pattern-1 + pattern-2 + pattern-3 + pattern-4 + pattern-5 + pattern-6 + pattern-7 + pattern-8 + pattern-9) + enumerate + make-hash))) + +(for/sum ([trial (in-list data)]) + (~>> trial + trial-data-output + (map (λ~>> (hash-ref (determine-arrangement trial)))) + (apply ~a) + string->number)) |