day10.lisp (1533B)
1 (defpackage #:adventofcode2022/day10 2 (:use #:cl #:adventofcode2022)) 3 (in-package #:adventofcode2022/day10) 4 5 (defun sprite-covers-pixel-p (pixel sprite-pos) 6 (<= (abs (- sprite-pos pixel)) 1)) 7 8 (defun run-cpu (inputs &optional video-stream) 9 (loop with x = 1 10 with i = 1 11 for (op value) in inputs 12 for ni = i 13 if (string= op "addx") 14 do (incf ni 2) 15 else 16 do (incf ni 1) 17 sum (loop for j from i below ni 18 when (or (= j 20) 19 (= j 60) 20 (= j 100) 21 (= j 140) 22 (= j 180) 23 (= j 220)) 24 sum (* j x) 25 do (format video-stream "~A" 26 (if (sprite-covers-pixel-p (mod (1- j) 40) x) 27 #\# 28 #\.)) 29 when (= 0 (mod j 40)) 30 do (format video-stream "~%")) 31 do (setf i ni) 32 when (string= op "addx") 33 do (incf x value))) 34 35 (defun task1 (inputs) 36 (run-cpu inputs)) 37 38 (defun task2 (inputs) 39 (with-output-to-string (s) 40 (run-cpu inputs s))) 41 42 (define-day 10 43 (:translate-input (lambda (line) 44 (let ((parts (uiop:split-string line :separator '(#\Space)))) 45 (when (cadr parts) 46 (setf (cadr parts) (parse-integer (cadr parts)))) 47 parts))) 48 #'task1 49 #'task2)