diff options
author | HJ <thechairman@thechairman.info> | 2023-12-15 08:33:14 -0500 |
---|---|---|
committer | HJ <thechairman@thechairman.info> | 2023-12-15 08:33:14 -0500 |
commit | 7a6795ab46a745bd841272a400213a4c0162437d (patch) | |
tree | 9ff6fd7953ec15b371941436fd4f3aecaab2c444 /aoc2023-other | |
parent | 7d7e1fca0fdb635cc6bfdf9e3cda3fe2b8e9a9c6 (diff) | |
download | gleam_aoc-7a6795ab46a745bd841272a400213a4c0162437d.tar.gz gleam_aoc-7a6795ab46a745bd841272a400213a4c0162437d.zip |
day 15 racket complete
Diffstat (limited to 'aoc2023-other')
-rw-r--r-- | aoc2023-other/day-15/day-15.rkt | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/aoc2023-other/day-15/day-15.rkt b/aoc2023-other/day-15/day-15.rkt new file mode 100644 index 0000000..59042e6 --- /dev/null +++ b/aoc2023-other/day-15/day-15.rkt @@ -0,0 +1,41 @@ +#lang racket + +(require advent-of-code + threading) + +(define input + (~> (fetch-aoc-input (find-session) 2023 15 #:cache #true) string-trim (string-split ","))) + +(define (hash-algorithm str) + (for/fold ([acc 0]) ([c (in-string str)]) + (~> c char->integer (+ acc) (* 17) (modulo _ 256)))) + +;; part 1 +(for/sum ([code (in-list input)]) (hash-algorithm code)) + +;; part 2 +(define (remove-lens boxes label) + (hash-update boxes + (hash-algorithm label) + (λ (lens-set) (remove label lens-set (λ (rem l) (equal? rem (car l))))) + '())) + +(define (insert-lens boxes label focal) + (define new-lens (cons label focal)) + (hash-update boxes + (hash-algorithm label) + (λ (lens-set) + (if (assoc label lens-set) + (map (λ (pair) (if (equal? (car pair) label) new-lens pair)) lens-set) + (append lens-set (list new-lens)))) + (list new-lens))) + +(define (focusing-power boxes) + (for*/sum ([(box-number lenses) (in-hash boxes)] [(lens order) (in-indexed lenses)]) + (match-define (cons _ focal) lens) + (* (add1 box-number) (add1 order) (string->number focal)))) + +(for/fold ([boxes (hash)] #:result (focusing-power boxes)) ([code (in-list input)]) + (match code + [(regexp #rx"(.*)=(.*)" (list _ label focal)) (insert-lens boxes label focal)] + [(regexp #rx"(.*)-" (list _ label)) (remove-lens boxes label)])) |