adventofcode2022

My solutions for Advent of Code 2022
Log | Files | Refs

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)