src/2018/days/day-03.lisp @ e41337e3b59b

Accessors
author Steve Losh <steve@stevelosh.com>
date Wed, 15 Dec 2021 23:10:57 -0500
parents 182bdd87fd9e
children (none)
(advent:defpackage* :advent/2018/03)
(in-package :advent/2018/03)
(named-readtables:in-readtable :interpol-syntax)


(defstruct (claim (:conc-name nil)) id left right top bottom)
(define-with-macro claim id left right top bottom)

(defun parse-claim (line)
  (ppcre:register-groups-bind
      ((#'parse-integer id col row width height))
      (#?r"#(\d+) @ (\d+),(\d+): (\d+)x(\d+)" line)
    (make-claim :id id
                :left col
                :top row
                :right (+ col width)
                :bottom (+ row height))))

(defun claims-intersect-p (claim1 claim2)
  (with-claim (claim1 id1 left1 right1 top1 bottom1)
    (with-claim (claim2 id2 left2 right2 top2 bottom2)
      (not (or (<= right2 left1)
               (<= right1 left2)
               (>= top2 bottom1)
               (>= top1 bottom2))))))

(defun make-fabric (claims)
  (let ((fabric (make-array (list 1000 1000) :initial-element 0)))
    (dolist (claim claims)
      (with-claim (claim)
        (do-range ((row top bottom)
                   (col left right))
                  (incf (aref fabric row col)))))
    fabric))


(define-problem (2018 3) (data read-lines) (107663 1166)
  (let* ((claims (mapcar #'parse-claim data))
         (fabric (make-fabric claims)))
    (values
      (iterate (for uses :in-array fabric)
               (counting (> uses 1)))
      (id (first (unique claims :test #'claims-intersect-p))))))