diff options
author | H.J <thechairman@thechairman.info> | 2024-10-09 11:36:55 -0400 |
---|---|---|
committer | H.J <thechairman@thechairman.info> | 2024-10-09 11:36:55 -0400 |
commit | 8777ff071f7bb37631baa7b6717ad29961e50911 (patch) | |
tree | 6d59c4ed58e454b960339c3d1151f0a879e8d7cb /racket/aoc2021/day-08/day-08.rkt | |
parent | 6156a9ef7be4012063a042aafb4e9b0d7eadde8e (diff) | |
download | gleam_aoc-8777ff071f7bb37631baa7b6717ad29961e50911.tar.gz gleam_aoc-8777ff071f7bb37631baa7b6717ad29961e50911.zip |
sorting by language
Diffstat (limited to 'racket/aoc2021/day-08/day-08.rkt')
-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)) |