Commit Diff


commit - 2b2d4b999710dc9b7dd4dda4d89a5f6be7a9d463
commit + 4d8a994d50d75ba86c7743d03f2975dec4a1a2f3
blob - /dev/null
blob + 9e078ce75252f6a6c3bd1889485a30bc4207dd31 (mode 644)
--- /dev/null
+++ input/16.txt
@@ -0,0 +1,110 @@
+\|.......|........|...../........................\.\.......\...-../..........\.........|...\......|...........
+.|.../............|.....|\..../....-.\...........-............./......................|.-.-...........\.....-.
+...............|........-....-...../..../|./.............\..|..................\..........|\.........../.\....
+....................|\..................\..................\/....................-....../................\.|..
+......././-......................................|.....|./.............................../....................
+.......................\.....|............-...\..|......-./...\.........../.............|..-......-...../.....
+.....................-.......\.......|............./........\.......|........../............/.................
+..................-................-./....................|....|...................-..................\.......
+|.......././.................................|.....-............................-.........|......../../.......
+.........../.......-........|................/......-....|.......\/..|..\...|..............-....\....|...-....
+............./-......./.....-./....\........./..|...............|..-......................-...................
+......-\.\..|/......-.|.........-.......-..\|.............................\.-.............\...............\...
+......\..../................\.........\..|...............-.......|..-|.....|-..........................-......
+.....\....../../..........\......-...........\.......-.\........./...........|\............-.............\....
+........\....................|........./...................|.........-.........\..............................
+.........-|.............\-.............................-..............|.....\../......|/......................
+..................../.......\/......./................../...../.......................|......|./.-......-|....
+..................../.........|..-.-./....../.|-..\..|........|......-.................\...\........./...\....
+....-...-....../...............................................|....................\..-..............-..|.-.\
+..........\..\.\....................-...|......................\......|......-.................\....|....../..
+\................../.....-./.......-...........\..../....../....|.........|........................|..........
+../......\.|..............................|../......................-.\..........\...............|..........|.
+.|..............................-...-........|...-........|........../............\...../.\......-....|.......
+............./...................\.\.........|...|../..........-.......\........../.-.-.....-..........-......
+..........................-.|\......|......./|.............../..../......--.....|.........|........../........
+/-....|/...-|..........\......................./..........-.....-.............\....../................\.......
+............-../............\...............................-.........\...\...........|-....|.................
+..............................|........-.........-..................|...........................-.............
+........./...............//.........................................-..........|............|..../............
+...\..||../........................./................|......./.......|....|.....|............|................
+........./...................\-./.......\...../............../..........-|...................|..../.......|...
+...../................/..-............../....................|/......................................-.|......
+\|........................................\...........-......../...\.|......|..\../........|.......\..........
+..|/......\....-...............||......//..................\\..-./...-....................|...................
+./....../................\../.\.....\.........\.\\\..........................-..\..-............./-...........
+........|..........-.....|..\..../....../.................../.............\...-.\...........\...........-.....
+..........\...|/..|......|\/./...........-.|.................-.|....|....................../..................
+-.......................-.|.............-../......./.../...-|..|.........../../..\............\../..........|.
+................./.........\..........-.........../..|.......//..............|..................|.....\.......
+.............-../......\./.../.|.|.....-..|.....|...\.........|.....-/..................-................|....
+|.-\..../...........-.....|....................//........\............./....../........./../\..\....-.........
+......\.|...........|..............|............/....-../.....\..................../...................|......
+../|....\....................................-.....--...|....../........-...................|...\.......\.....
+..........|../..-.........-...........|....................../............/.......................|.|.........
+........./..................\............................\..............|..................................\..
+...-|...........-......\|\...........\...\.........|..../......../..../..../..-|||................-...........
+..|....-\..\......./...........\\.................................|......-./.............../........|..--.....
+.................................../|...........-.......-...|..-............-........../......................
+.......|.............|.......................................................\...............\................
+........\.......|...........|............................\-......................................|............
+......|..\.-../......................|.-.../.....-..|.-.................................-.......\......./.|...
+--\...../..........-...........\...................../.....|/............\..............-............./.......
+......|-...............\........................................../.-\..|.....-........|..\./../.-..........|.
+.........................//.....-...................|...|..-.\....|................|......\..-............/...
+./.........-...-....................../......\\......||..........|....................--.................../..
+....-........\........................../..........|........./.........................\.\....|.......-|......
+.|\/...............|...-.|....|../..|...|...../......\..........|.............|........\.....|................
+...../.-\.-................|......../....-..\......|/.......\.......................\.......................|.
+......................|..........-..../..../.\../................../......................|..............\|...
+........../-\......|............................../....-......................................./..............
+./..........|.....-.............-..-...|../........\.-...........|.........................-................-.
+.-....-................|..................-...-...........-........|.|..........-.-...........................
+...|...............|.................\.......|.............../................\....|.............|.........\..
+..\..............|.............\..................\.......................|..........-........................
+../........./............\.\../.........................\../.....-....|....................-............../...
+...\................\......../......................./\....\..-........\........./..\.........................
+.........../..|.......-.........-|..............................................\...............-./\||...../..
+...............\........-..|..........||......................../..........-...../........................\...
+...........\.....................-................................................................|..........|
+./.........-.......-................................\..........||..|.|..\.........\.../..||......-.......\....
+\......\.........-..\......\...................-..|.....\.....\....................|..........-......-........
+.............|..........\..........-..................\.\..........|.....................|.............-/.....
+........-................|......./..-...............\......|-...\.....\.............|./..\\../....-.../.......
+..................\..||.............-........|............/.........\../...\..|/.....\.........\..........|...
+..|../..................\..............................|...........................................-..........
+\..................../.|.......\...|-............../......\.............././..-...................|...........
+......./..............................\..................|................\............./....-.....-..........
+..............|.........../...............................\.................\..|........-.......-.\.....|.....
+.................|.....\........................................-.\.\..\...................//.....\./.........
+....../..........|..-............/..........\............../.............|....................................
+.............|..........-.|..\..........-....\...........................|.....................\.\....-.......
+..........\............../........-........|.....-./...........................................\..........\...
+..........|.-...|.|...............-...|.|..................-...-........|/.../.............................\..
+.............-....\.....................................................\........................|...........\
+..\|...........|....-.-|........................................|.............................\.....\.-|......
+...........//.|.............-......\.........................|............-|...............././.....|....|....
+.............../.\...............--........|........-....\..../.........-.....................-......../...-..
+.....|......\.........../............/..................../.........|...........-.......-.|...........-.......
+.................-........./..........|...................../..........................|.|...........-.......|
+.....|...-........|...................../.../...................................\.............\...|...........
+.............\.......|........................./....|........./........\.........\.......................\....
+............................/-..................................../........-..............\...|.....\..|\.....
+...-..././....................-.......|................./..........-.....|.|..............\..........-....\...
+.....\\......\...............................-...-........-.|..../........\.\.....-.....................|.....
+..............\.........\.\.|..........-......//./.../....|.............-.../..|.........................\....
+...................../...........\.........................\.-..|..........|........./|...............|/...\|.
+..|.-./.............-.........././.|......../.......\...........-.........../..........\.....-.........-......
+.....|......\....-.........-.............|.......|-........|-...-../-..|.......-................-.............
+.................|.........|....\................................/.-.....|........./..../..........-..........
+-....\......./......\.\..................-..|./......-...\.\...-.........................\.............|......
+......................./..............\/..........-................../............\.......\..\.......\....../.
+.|...............//.................................../.......\.......\.\..........-\...|............-........
+.../......................|.....-.........../................-.../............../.........\.\.../........../..
+..................................|\..................-../........-./..\......./....|../.......|-.............
+.....\..........|................/........\..........-......../\../..../.\-.|...\....|\.............\|..--....
+................./................................././|..../..........|............../............../.........
+..............|......|.......\....|...|......|..................................\.......-....\/...........|...
+......./\..................................-......./......\....\..-..................-................\......|
+...........-.........../..............\............|....../....../.......\........./......../..\.........\...-
+.-..................\............................/\...................|...........|....\....\--/............/.
blob - /dev/null
blob + 396ec8a2339c5e723e63313fa58e22d6f9be35af (mode 644)
--- /dev/null
+++ src/day-16.lisp
@@ -0,0 +1,64 @@
+(defpackage #:aoc/day-16
+  (:use #:cl #:aoc/utils)
+  (:export #:day-16))
+(in-package #:aoc/day-16)
+
+(defconstant +pipe-char+ (code-char 124))
+
+(defun next-directions (cell direction)
+  (eswitch (cell)
+    (#\/ (switch (direction)
+           (:right '(:up))
+           (:down '(:left))
+           (:up '(:right))
+           (:left '(:down))))
+    (#\\ (switch (direction)
+           (:right '(:down))
+           (:down '(:right))
+           (:up '(:left))
+           (:left '(:up))))
+    (#\- (switch (direction)
+           (:down '(:right :left))
+           (:up '(:right :left))
+           (t (list direction))))
+    (+pipe-char+
+     (switch (direction)
+       (:left '(:up :down))
+       (:right '(:up :down))
+       (t (list direction))))
+    (#\. (list direction))))
+
+(defun move-position (pos direction)
+  (eswitch (direction)
+    (:right (point+ pos (cons 1 0)))
+    (:down (point+ pos (cons 0 1)))
+    (:up (point+ pos (cons 0 -1)))
+    (:left (point+ pos (cons -1 0)))))
+
+(defun shoot-beam (map)
+  (loop with energizing-map = (make-hash-table :test 'equal)
+        with passing-map = (make-hash-table :test 'equal)
+        with todo = (list (list (cons 0 0) :right))
+        with width = (input-map-width map)
+        with height = (input-map-height map)
+        for (pos direction) = (pop todo)
+        while pos
+        for cell = (map-cell map pos)
+        for directions = (next-directions cell direction)
+        do (setf (gethash pos energizing-map)
+                 (1+ (or (gethash pos energizing-map) 0))
+                 (gethash (list pos direction) passing-map)
+                 t)
+        do (loop for dir in directions
+                 for new-pos = (move-position pos dir)
+                 unless (or (< (point-x new-pos) 0)
+                            (< (point-y new-pos) 0)
+                            (>= (point-x new-pos) width)
+                            (>= (point-y new-pos) height)
+                            (gethash (list new-pos dir) passing-map))
+                   do (push (list new-pos dir) todo))
+        finally (return (hash-table-count energizing-map))))
+
+(defun day-16 (input)
+  (let ((map (make-map input)))
+    (shoot-beam map)))
blob - /dev/null
blob + 351995254ba27a74d3a147bf87eff2c5965295d8 (mode 644)
--- /dev/null
+++ t/day-16.lisp
@@ -0,0 +1,18 @@
+(defpackage #:aoc-test/day-16
+  (:use #:cl #:lisp-unit2))
+(in-package #:aoc-test/day-16)
+
+(define-test test-day-16
+    ()
+  (multiple-value-bind (task-1)
+      (aoc:run-day 16 ".|...\\....
+|.-.\\.....
+.....|-...
+........|.
+..........
+.........\\
+..../.\\\\..
+.-.-/..|..
+.|....-|.\\
+..//.|....")
+    (assert= 46 task-1)))