diff options
author | J.J <thechairman@thechairman.info> | 2023-11-30 17:10:00 -0500 |
---|---|---|
committer | J.J <thechairman@thechairman.info> | 2023-11-30 17:10:00 -0500 |
commit | 8ab65dc2da1742eb86ec636c50c7018385b68167 (patch) | |
tree | c4fd556aca9b867cfa1f2f174128c30857353884 /aoc2021/day-14 | |
parent | fafbeaf9e3c09ba7a5bea7e47d5736001f8a5aa1 (diff) | |
download | gleam_aoc-8ab65dc2da1742eb86ec636c50c7018385b68167.tar.gz gleam_aoc-8ab65dc2da1742eb86ec636c50c7018385b68167.zip |
prep for 2023, renaming for consistency
Diffstat (limited to 'aoc2021/day-14')
-rw-r--r-- | aoc2021/day-14/day-14.rkt | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/aoc2021/day-14/day-14.rkt b/aoc2021/day-14/day-14.rkt new file mode 100644 index 0000000..e445694 --- /dev/null +++ b/aoc2021/day-14/day-14.rkt @@ -0,0 +1,61 @@ +#lang racket +(require "../../jj-aoc.rkt" + threading + memoize + algorithms + list-utils) + +(define data (port->lines (open-day 14 2021))) + +(define (starting-polymer d) + (~> d first string->list (sliding 2 1))) + +(define (first-char d) + (first (first (starting-polymer d)))) + +(define (starting-counts d) + (~> d first frequencies hash->list make-hash)) + +(define (starting-pairs d) + (~>> d (drop _ 2) (map (λ~> (substring 0 2) string->list)))) + +(define (new-pairs d) + (~>> d + (drop _ 2) + (map (λ~> (string-replace " -> " "") + string->list + ((match-lambda + [(list a b c) (list a c b)]) + _) + (sliding 2 1))))) + +(define (transform d) + (~>> (map list (starting-pairs d) (new-pairs d)) (append*) (apply hash))) + +(define transformation (transform data)) + +(define/memo (get-count polymer times) + (match times + [0 + (for/fold ([counts (hash)]) ([pair (in-list polymer)]) + (hash-update counts (second pair) add1 0))] + [_ + (for*/fold ([counts (hash)]) + ([pair (in-list polymer)] + [(c n) (in-hash (get-count (hash-ref transformation pair) (sub1 times)))]) + (hash-update counts c (λ~> (+ n)) 0))])) + +;; part 1 +(define (process-polymer d n) + (~> d + starting-polymer + (get-count _ n) + (hash-update _ (first-char d) add1 0) + hash-values + (sort >) + ((λ (l) (- (first l) (last l)))))) + +(process-polymer data 10) + +;; part 2 +(process-polymer data 40) |