Skip to content

Instantly share code, notes, and snippets.

@death
Created December 5, 2021 11:49
Show Gist options
  • Select an option

  • Save death/311f2279056f1ae678f1433d4d20deeb to your computer and use it in GitHub Desktop.

Select an option

Save death/311f2279056f1ae678f1433d4d20deeb to your computer and use it in GitHub Desktop.
aoc2021-day5
;;;; +----------------------------------------------------------------+
;;;; | Advent of Code 2021 |
;;;; +----------------------------------------------------------------+
(defpackage #:snippets/aoc2021/day5
(:use #:cl)
(:export
#:day5))
(in-package #:snippets/aoc2021/day5)
(defstruct diagram
(coverage (make-hash-table :test 'equal))
(num-overlapping-points 0))
(defstruct (line-segment (:type list)
(:conc-name))
x1 y1 x2 y2)
(defun hv-line-segment-p (line-segment)
(or (= (x1 line-segment) (x2 line-segment))
(= (y1 line-segment) (y2 line-segment))))
(defun draw-point (diagram x y)
(let ((k (incf (gethash (list x y) (diagram-coverage diagram) 0))))
(when (= k 2)
(incf (diagram-num-overlapping-points diagram)))))
(defun draw-line-segment (diagram line-segment)
(do* ((dx (signum (- (x2 line-segment)
(x1 line-segment))))
(dy (signum (- (y2 line-segment)
(y1 line-segment))))
(x (x1 line-segment) (+ x dx))
(y (y1 line-segment) (+ y dy)))
((or (and (not (zerop dx))
(= (- x dx) (x2 line-segment)))
(and (not (zerop dy))
(= (- y dy) (y2 line-segment)))))
(draw-point diagram x y)))
(defun draw-line-segments (diagram line-segments)
(dolist (line-segment line-segments)
(draw-line-segment diagram line-segment))
(diagram-num-overlapping-points diagram))
(defun day5 (input)
(let ((diagram (make-diagram)))
(list (draw-line-segments diagram (remove-if-not #'hv-line-segment-p input))
(draw-line-segments diagram (remove-if #'hv-line-segment-p input)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment