Add day 04 (and fn library)
[adventofcode2020.git] / src / day03.lisp
diff --git a/src/day03.lisp b/src/day03.lisp
new file mode 100644 (file)
index 0000000..6cd0743
--- /dev/null
@@ -0,0 +1,57 @@
+(in-package #:adventofcode2020)
+
+(defun tree-collisions (slope tree-map)
+  (destructuring-bind (rise run) slope
+    (loop with terrain-width = (-> tree-map first length)
+          for i upfrom 0 by run
+          for j upfrom 0
+          for terrain-line in tree-map
+          when (->> rise (mod j) (= 0))
+          counting (->> terrain-width
+                     (mod i)
+                     (char terrain-line)
+                     (char= #\#)))))
+
+(day 03 input
+  (let ((tree-map (list-from input)))
+    (part1 (tree-collisions '(1 3) tree-map))
+    (part2 (->> '((1 1) (1 3) (1 5) (1 7) (2 1))
+             (mapcar (fn* (tree-collisions _ tree-map)))
+             (reduce #'*)))))
+
+(def-suite day03)
+(in-suite day03)
+
+(test single-collision-check
+  (is (equal
+        7
+        (tree-collisions '(1 3) '("..##......."
+                                  "#...#...#.."
+                                  ".#....#..#."
+                                  "..#.#...#.#"
+                                  ".#...##..#."
+                                  "..#.##....."
+                                  ".#.#.#....#"
+                                  ".#........#"
+                                  "#.##...#..."
+                                  "#...##....#"
+                                  ".#..#...#.#")))))
+
+
+(test multiple-collision-check
+  (is (equal
+        '(2 7 3 4 2)
+        (mapcar (fn* (tree-collisions _ '("..##......."
+                                          "#...#...#.."
+                                          ".#....#..#."
+                                          "..#.#...#.#"
+                                          ".#...##..#."
+                                          "..#.##....."
+                                          ".#.#.#....#"
+                                          ".#........#"
+                                          "#.##...#..."
+                                          "#...##....#"
+                                          ".#..#...#.#")))
+                '((1 1) (1 3) (1 5) (1 7) (2 1))))))
+
+(run! 'day03)