From 914efa4071448ae8005784c45b9dc2b028e19d47 Mon Sep 17 00:00:00 2001 From: Oscar Najera Date: Wed, 6 Dec 2023 08:57:43 +0100 Subject: [AoC2023] day06 lisp part 1 --- AoC2023/day06/input | 2 ++ AoC2023/day06/solver.lisp | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 AoC2023/day06/input create mode 100644 AoC2023/day06/solver.lisp diff --git a/AoC2023/day06/input b/AoC2023/day06/input new file mode 100644 index 0000000..973ba45 --- /dev/null +++ b/AoC2023/day06/input @@ -0,0 +1,2 @@ +Time: 47 70 75 66 +Distance: 282 1079 1147 1062 diff --git a/AoC2023/day06/solver.lisp b/AoC2023/day06/solver.lisp new file mode 100644 index 0000000..460b554 --- /dev/null +++ b/AoC2023/day06/solver.lisp @@ -0,0 +1,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"))))) -- cgit v1.2.3