aboutsummaryrefslogtreecommitdiff
path: root/aoc2023-other/day-09/day-09.rkt
blob: 5eda1eb01e2f4f2fd23d9a4e527da003f9595818 (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
#lang racket

(require advent-of-code
         threading)

(define histories
  (for/list ([raw-history (in-lines (open-aoc-input (find-session) 2023 9 #:cache #true))])
    (~>> raw-history 
         string-split 
         (map string->number))))

(define (constant? xs) 
  (= 1 (length (remove-duplicates xs))))

(define/match (derivative xs)
  [((list a b)) (list (- b a))]
  [((list* a b _)) (cons (- b a) (derivative (rest xs)))])

(define (extrapolate xs) 
  (if (constant? xs) 
      (car xs) 
      (+ (last xs) (extrapolate (derivative xs)))))

;; part 1
(~>> histories 
     (map extrapolate) 
     (apply +))

;; part 2
(~>> histories 
     (map (λ~> reverse extrapolate)) 
     (apply +))