commit - be76554e85d7a77b4e6a473b9761762daa0ee338
commit + b8b20282833063ad94b1908cc8306e85aedf677e
blob - f74baa7b5e93abb68cd98f2bf30af980c7c2a42e
blob + abe915cc5736f8c03920a07f644bef3d8f1e085c
--- src/day-13.lisp
+++ src/day-13.lisp
(:export #:day-13))
(in-package #:aoc/day-13)
-(defun find-vertical-point-of-reflection (map)
- (loop with width = (input-map-width map)
- with height = (input-map-height map)
- for reflection-x from 0 below (1- width)
- for reflection-length = (min (1+ reflection-x)
- (- width reflection-x 1))
- when (loop repeat reflection-length
- for x-1 downfrom reflection-x
- for x-2 from (1+ reflection-x)
- always (loop for y from 0 below height
- always (char= (map-cell map (cons x-1 y))
- (map-cell map (cons x-2 y)))))
- do (return (1+ reflection-x))))
+(defun reflection-finding-properties (map type)
+ (ecase type
+ (:vertical
+ (values (input-map-width map)
+ (input-map-height map)
+ (lambda (primary secondary)
+ (cons primary secondary))))
+ (:horizontal
+ (values (input-map-height map)
+ (input-map-width map)
+ (lambda (primary secondary)
+ (cons secondary primary))))))
-(defun find-horizontal-point-of-reflection (map)
- (loop with width = (input-map-width map)
- with height = (input-map-height map)
- for reflection-y from 0 below (1- height)
- for reflection-length = (min (1+ reflection-y)
- (- height reflection-y 1))
- when (loop repeat reflection-length
- for y-1 downfrom reflection-y
- for y-2 from (1+ reflection-y)
- always (loop for x from 0 below width
- always (char= (map-cell map (cons x y-1))
- (map-cell map (cons x y-2)))))
- do (return (1+ reflection-y))))
+(defun find-point-of-reflection (map type)
+ (multiple-value-bind (primary-axis-length secondary-axis-length make-point)
+ (reflection-finding-properties map type)
+ (loop for reflection-point from 0 below (1- primary-axis-length)
+ for reflection-length = (min (1+ reflection-point)
+ (- primary-axis-length reflection-point 1))
+ when (loop repeat reflection-length
+ for compare-1 downfrom reflection-point
+ for compare-2 from (1+ reflection-point)
+ always (loop for secondary-axis-point from 0 below secondary-axis-length
+ for point-1 = (funcall make-point compare-1 secondary-axis-point)
+ for point-2 = (funcall make-point compare-2 secondary-axis-point)
+ always (char= (map-cell map point-1)
+ (map-cell map point-2))))
+ do (return (1+ reflection-point)))))
(defun day-13 (input)
(loop for map = (make-map input)
while map
- sum (or (find-vertical-point-of-reflection map)
- (* (find-horizontal-point-of-reflection map) 100))))
+ sum (or (find-point-of-reflection map :vertical)
+ (* (find-point-of-reflection map :horizontal) 100))))