]> localhost Git - adventofcode2020.git/commitdiff
Add day 04 (and fn library)
authorJack Kinsey <j.jameskinsey@gmail.com>
Fri, 4 Dec 2020 05:02:45 +0000 (00:02 -0500)
committerJack Kinsey <j.jameskinsey@gmail.com>
Fri, 4 Dec 2020 05:02:45 +0000 (00:02 -0500)
adventofcode2020.asd
package.lisp
src/day03.lisp [new file with mode: 0644]

index 96f4fbdcfc1c03f03b67adc1b7c246bd9dba42d2..031f2e812ff385d3ed22af5dc250412ba09356e8 100644 (file)
@@ -7,9 +7,11 @@
   :serial t
   :depends-on (:alexandria
                :arrow-macros
+               :fn
                :fiveam)
   :pathname "src/"
   :components ((:file "package")
+               (:file "utilities")
                (:file "adventofcode2020"))
   :in-order-to ((test-op (test-op :adventofcode2020/test))))
 
index 6a6f94b5ae4c3cc9bffcfe4dd432c0daea1d9445..77c89221b17ec447e8ce8af285a28c4ec05013a2 100644 (file)
@@ -1,8 +1,11 @@
-; (ql:quickload :fiveam) (ql:quickload :cl-ppcre)
-(defpackage #:adventofcode2020
-  (:use #:cl 
-        #:arrow-macros
-        #:alexandria
-        #:fiveam)
+(progn (ql:quickload :fiveam) 
+       (ql:quickload :cl-ppcre) 
+       (ql:quickload :fn))
+(defpackage :adventofcode2020
+  (:use :cl 
+        :arrow-macros
+        :alexandria
+        :fn
+        :fiveam)
   (:import-from :cl-ppcre :split)
   (:nicknames :aoc2020))
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)