adventofcode2022

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

commit b395818b35867113db7d5ceea12cd630c14f8db1
parent 4d1ebe018a49bcd81cb48be2f49552fb20551ba8
Author: Lukas Henkel <lh@entf.net>
Date:   Sat, 10 Dec 2022 09:18:23 +0100

Day 10 task 2

Diffstat:
Msrc/day10.lisp | 22+++++++++++++++++++---
Mt/day10.lisp | 12++++++++++++
2 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/src/day10.lisp b/src/day10.lisp @@ -2,7 +2,10 @@ (:use #:cl #:adventofcode2022)) (in-package #:adventofcode2022/day10) -(defun task1 (inputs) +(defun sprite-covers-pixel-p (pixel sprite-pos) + (<= (abs (- sprite-pos pixel)) 1)) + +(defun run-cpu (inputs &key (video-stream t)) (loop with x = 1 with i = 1 for (op value) in inputs @@ -18,11 +21,24 @@ (= j 140) (= j 180) (= j 220)) - sum (* j x)) + sum (* j x) + do (format video-stream "~A" + (if (sprite-covers-pixel-p (mod (1- j) 40) x) + #\# + #\.)) + when (= 0 (mod j 40)) + do (format video-stream "~%")) do (setf i ni) when (string= op "addx") do (incf x value))) +(defun task1 (inputs) + (run-cpu inputs)) + +(defun task2 (inputs) + (with-output-to-string (s) + (run-cpu inputs :video-stream s))) + (define-day 10 (:translate-input (lambda (line) (let ((parts (uiop:split-string line :separator '(#\Space)))) @@ -30,4 +46,4 @@ (setf (cadr parts) (parse-integer (cadr parts)))) parts))) #'task1 - nil) + #'task2) diff --git a/t/day10.lisp b/t/day10.lisp @@ -152,3 +152,15 @@ noop") (= 13140 (run-task 10 1 (make-string-input-stream +testdata-day10+))))) + +(def-test day10-task2 () + (is-true + (string= (run-task 10 2 + (make-string-input-stream +testdata-day10+)) + "##..##..##..##..##..##..##..##..##..##.. +###...###...###...###...###...###...###. +####....####....####....####....####.... +#####.....#####.....#####.....#####..... +######......######......######......#### +#######.......#######.......#######..... +")))