aboutsummaryrefslogtreecommitdiff
path: root/aoc2023-other/day-15/day-15.rkt
blob: d049565c55d46d5ad8eecc0f07124bbf0488a65b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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)])
    (* (add1 box-number) (add1 order) (cdr lens))))

(for/fold ([boxes (hash)] #:result (focusing-power boxes)) ([code (in-list input)])
  (match code
    [(regexp #rx"(.*)=(.*)" (list _ label (app string->number focal)))
     (insert-lens boxes label focal)]
    [(regexp #rx"(.*)-" (list _ label)) (remove-lens boxes label)]))