aboutsummaryrefslogtreecommitdiff
path: root/racket/aoc2021/day-17/day-17.rkt
blob: 7de44a034469206f66e73961343dd0298b47e76a (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
42
43
#lang racket
(require "../../jj-aoc.rkt"
         threading)

(define-values (x-min x-max y-min y-max)
  (~> (open-day 17 2021)
      port->string
      (regexp-match #px"target area: x=(.*)\\.\\.(.*), y=(.*)\\.\\.(.*)\n" _)
      rest
      (map string->number _)
      (apply values _)))

(define (hit? x y)
  (and (x . >= . x-min) (x . <= . x-max) (y . >= . y-min) (y . <= . y-max)))

(define (miss? x y)
  (or (y . < . y-min) (x . > . x-max)))

(define (drag dx i)
  (max (- dx i) 0))
(define (gravity dy i)
  (- dy i))

(define (find-trajectory-apex dx dy)
  (for/fold ([x 0] [y 0] [y-apex 0] [result #f] #:result (list y-apex result))
            ([i (in-naturals)] #:break result)
    (cond
      [(hit? x y) (values dx dy y-apex 'hit)]
      [(miss? x y) (values x y 'miss 'miss)]
      [else (values (+ x (drag dx i)) (+ y (gravity dy i)) (if (y . > . y-apex) y y-apex) #f)])))

(define on-target
  (for*/list ([dx (in-inclusive-range 1 x-max)]
              [dy (in-inclusive-range y-min (abs (* 2 y-max)))]
              [velocity (in-value (find-trajectory-apex dx dy))]
              #:when (equal? (second velocity) 'hit))
    (list dx dy (first velocity))))

;; part 1
(~>> on-target (argmax third) third)

;; part 2
(length on-target)