blob: 460b554196ef606da28782df889f63ab0a8f2ba7 (
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
|
(ql:quickload '(fiveam str arrows))
(defparameter eg-input "Time: 7 15 30
Distance: 9 40 200")
(defun bounds (time r &optional lower)
(multiple-value-bind (point reminder)
(if lower
(ceiling (/ (- time (sqrt (- (* time time) (* 4 r)))) 2))
(floor (/ (+ time (sqrt (- (* time time) (* 4 r)))) 2)))
(if (zerop reminder)
(funcall (if lower #'1+ #'1-) point)
point)))
(defun charge-time-solutions (pair)
(destructuring-bind (race-time . record-distance) pair
;; quadratic equation: -charge_time**2 + race_time*charge_time - record_distance
(let ((lower (bounds race-time record-distance 'lower))
(upper (bounds race-time record-distance)))
(1+ (- upper lower)))))
(defun solver1 (lines)
(arrows:->>
lines
(mapcar
(lambda (line)
(mapcar #'parse-integer (cdr (str:split-omit-nulls #\Space line)))))
(apply #'mapcar #'cons)
(mapcar #'charge-time-solutions)
(apply #'*)))
(fiveam:test solutions
(fiveam:is
(= 288
(solver1
(uiop:split-string eg-input :separator '(#\Newline)))))
(fiveam:is
(= 281600
(solver1
(uiop:read-file-lines "input")))))
|