Created
December 5, 2021 11:49
-
-
Save death/311f2279056f1ae678f1433d4d20deeb to your computer and use it in GitHub Desktop.
aoc2021-day5
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ;;;; +----------------------------------------------------------------+ | |
| ;;;; | 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