01.lisp (963B)
1 (defun day1-part1 (input-file) 2 (with-open-file (s input-file) 3 (let ((dial 50) 4 (zeroes 0)) 5 (do ((line (read-line s nil) (read-line s nil))) 6 ((equal line nil) zeroes) 7 (let* ((n (parse-integer (subseq line 1))) 8 (is-r (equal "R" (subseq line 0 1))) 9 (op (if is-r #'+ #'-))) 10 (setf dial (mod (funcall op dial n) 100)) 11 (if (equal 0 dial) 12 (setf zeroes (1+ zeroes)))))))) 13 14 ; We'll go for a naive approach early in the game, just count in steps of one and check the zeroes. 15 (defun day1-part2 (input-file) 16 (with-open-file (s input-file) 17 (let ((dial 50) 18 (zeroes 0)) 19 (do ((line (read-line s nil) (read-line s nil))) 20 ((equal line nil) zeroes) 21 (let* ((n (parse-integer (subseq line 1))) 22 (is-r (equal "R" (subseq line 0 1))) 23 (op (if is-r #'+ #'-))) 24 (dotimes (i n) 25 (setf dial (mod (funcall op dial 1) 100)) 26 (if (equal 0 dial) 27 (setf zeroes (1+ zeroes)))))))))