aboutsummaryrefslogtreecommitdiff
path: root/aoc2023-racket/day-06/day-06.rkt
blob: 53ca9eefc82d5361d2bb659ed5544043af3e1be1 (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)

(match-define (list times distances)
  (~> (open-aoc-input (find-session) 2023 6 #:cache #true) port->lines))

;; part 1
(define get-numbers (λ~> string-split (map string->number _) rest))
(define (find-bound race-time dist button-time step)
  (if (< dist (* button-time (- race-time button-time)))
      button-time
      (find-bound race-time dist (+ step button-time) step)))

(define (lower-bound rtime dist)
  (find-bound rtime dist 1 1))
(define (upper-bound rtime dist)
  (find-bound rtime dist rtime -1))

(for/fold ([acc 1])
          ([race-time (in-list (get-numbers times))]
           [distance (in-list (get-numbers distances))])
  (* acc (add1 (- (upper-bound race-time distance) (lower-bound race-time distance)))))

;; part 2

(define unkern (λ~>> get-numbers (apply ~a) string->number))
(define big-time (unkern times))
(define big-distance (unkern distances))

(add1 (- (upper-bound big-time big-distance) (lower-bound big-time big-distance)))