(defpackage :aoc/2024/02 (:use :cl :aoc :alexandria) (:export #:sample-data #:part1 #:part2 #:deltas #:safe-levels #:safe-levels-with-dampener )) (in-package :aoc/2024/02) (defun parse-line (s) (map 'list #'parse-integer (cl-ppcre:split " " s))) (defvar input-data '()) (setf input-data (map 'list #'parse-line (test-input 2024 2))) (defvar sample-text "") (setf sample-text (aoc:split-lines "7 6 4 2 1 1 2 7 8 9 9 7 6 2 1 1 3 2 4 5 8 6 4 4 1 1 3 6 7 9 ")) (defvar sample-data '()) (setf sample-data (map 'list #'parse-line sample-text)) (defun deltas (levels) (map 'list #'- (subseq levels 1) levels)) (defun safe-levels (levels) (let ((ds (deltas levels))) (and (or (every #'plusp ds) (every #'minusp ds)) (every (lambda (d) (>= 3 (abs d))) ds)))) (defun remove-nth (n xs) (append (subseq xs 0 (1- n)) (nthcdr n xs))) (defun safe-levels-with-dampener (levels) (or (safe-levels levels) (loop for n from 1 to (length levels) thereis (safe-levels (remove-nth n levels))))) (defun part1 (data) (loop for report in data count (safe-levels report))) (defun part2 (data) (loop for report in data count (safe-levels-with-dampener report))) (defun solve-day () (format t "part1: ~A~%" (part1 input-data)) (format t "part2: ~A~%" (part2 input-data)))