commit - 562cace75e1d775536106561ec459bbdd51e5388
commit + d2f25f66d712a2d3cfdfa79a23a4df06dc2d8922
blob - f6b4392c49275c136533ae25814b6a3b9c861784
blob + e82dbf124ff526f0b4a7da01956dff6ff19c852d
--- src/day-6.lisp
+++ src/day-6.lisp
(:export #:day-6))
(in-package #:aoc/day-6)
-(defun task-1 (times distances)
- (loop with task-1 = nil
- for time in times
- for distance in distances
- do (push (loop for speed from 1 below time
- for remaining-time = (- time speed)
- for travelled = (* speed remaining-time)
- when (> travelled distance)
- sum 1 fixnum)
- task-1)
- finally (return (apply #'* task-1))))
+(declaim (ftype (function (fixnum fixnum fixnum) t) beats-distance-p)
+ (inline beats-distance-p))
+(defun beats-distance-p (speed time distance)
+ (let* ((remaining-time (- time speed))
+ (travelled (the fixnum (* speed remaining-time))))
+ (> travelled distance)))
-(defun join-numbers (numbers)
- (parse-integer (apply 'concatenate 'string
- (mapcar #'write-to-string numbers))))
-
-(defun task-2 (time distance)
+(declaim (ftype (function (fixnum fixnum) fixnum) possible-ways-to-beat))
+(defun possible-ways-to-beat (time distance)
(let ((start (loop for speed from 1 below time
- for remaining-time = (- time speed)
- for travelled = (* speed remaining-time)
- when (> travelled distance)
+ when (beats-distance-p speed time distance)
do (return speed)))
(end (loop for speed from (1- time) downto 1
- for remaining-time = (- time speed)
- for travelled = (* speed remaining-time)
- when (> travelled distance)
+ when (beats-distance-p speed time distance)
do (return speed))))
(- end start -1)))
+(defun join-numbers (numbers)
+ (parse-integer (apply 'concatenate 'string
+ (mapcar #'write-to-string numbers))))
+
(defun day-6 (input)
(let* ((line (read-line input))
(times (read-number-list line :start (1+ (position #\: line))))
(line (read-line input))
(distances (read-number-list line :start (1+ (position #\: line)))))
- (values (task-1 times distances)
- (task-2 (join-numbers times)
- (join-numbers distances)))))
+ (values (loop with task-1 fixnum = 1
+ for time in times
+ for distance in distances
+ do (setf task-1 (* task-1 (possible-ways-to-beat time distance)))
+ finally (return task-1))
+ (possible-ways-to-beat (join-numbers times)
+ (join-numbers distances)))))