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
res/day03 [new file with mode: 0644]
src/day03.lisp [new file with mode: 0644]

index 96f4fbdcfc1c03f03b67adc1b7c246bd9dba42d2..031f2e812ff385d3ed22af5dc250412ba09356e8 100644 (file)
@@ -7,9 +7,11 @@
   :serial t
   :depends-on (:alexandria
                :arrow-macros
   :serial t
   :depends-on (:alexandria
                :arrow-macros
+               :fn
                :fiveam)
   :pathname "src/"
   :components ((:file "package")
                :fiveam)
   :pathname "src/"
   :components ((:file "package")
+               (:file "utilities")
                (:file "adventofcode2020"))
   :in-order-to ((test-op (test-op :adventofcode2020/test))))
 
                (: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))
   (:import-from :cl-ppcre :split)
   (:nicknames :aoc2020))
diff --git a/res/day03 b/res/day03
new file mode 100644 (file)
index 0000000..fd04fb1
--- /dev/null
+++ b/res/day03
@@ -0,0 +1,323 @@
+....#...............##...#...#.
+#...#..#.....##.##.#.##....#...
+...#.....#...#.................
+#..#..#.......#...#.#..........
+...##..#.#..........##...#.....
+........###.#.##..#............
+...###......##.#..#.#...#.#....
+......##..#.#....#...#.........
+.................#......#......
+..............##....#..........
+#.....................#...#.#.#
+.##..#............##...##.##..#
+.....#.####...#..##......#.#..#
+#.......#.#..#......##.#.#....#
+.....##...###.#..........##....
+#...........#.##....##.....#..#
+..###..##.##.....#....#........
+...#.#.#............#.#..#....#
+#......#....#...##.#.#.#.#..#..
+.......#.#...#..#..#..##......#
+.....#..#.............#..#...#.
+##..#.##.....#........#........
+....##....#..#...........#...#.
+.......#........##.......##....
+..##...#.......#........##.#...
+..........#..#.....##........#.
+..#..##..#............#........
+.#.#...#...#.......#......#....
+....#....#.....#.#.........###.
+.............#...#....#..#.#...
+##.#...#..#......#.#.##.....#..
+#...##.#..........#..#.#...#...
+#####.......#.#.....#..#.......
+#...#...#........#....#...#....
+......##.#..#..#............#..
+....#....#.......#...###.......
+.#......##...#.##....#...#.....
+..#....#...##.....#.#...##.#...
+#.......#........#.####........
+#.##..#..#.........#.#........#
+.#...#.#.#.#......#....#.#..#..
+#...####...##.##.#....#......##
+..#...#......##........#.....#.
+...#.#....##...................
+...##................#.........
+...##.....##........#....#..#..
+.........#..#.....#............
+.#..#.......................#..
+.#.........#..##........#.#.#.#
+......#.....##..#.##...#..#.##.
+..#..............##.......#....
+...............##....#...##..#.
+###...#..###.........#...#.....
+...#..#...#....#.....##........
+....#..##...#........#.........
+..#......#.......#.....#..#....
+.#...........##.....###....#...
+.#..#.....##.........##.....#..
+....##.#.....#................#
+..#..#......#.#..#....#..##....
+#.....#...##............#......
+.#.............#....#.......#..
+#.........#..#...##.#...#.#.##.
+...#......#..####....#.#.....#.
+......#........#..........##.##
+......##.#..##.##.....#........
+##.....#..##.##..#.......##....
+.##.........#...........#...#..
+.....#...###..#...#...........#
+..........#.#......#.###.....#.
+...#.............#.##......##..
+#.##.........#..###...........#
+....#..##....#..#..#........###
+...#........##.......##..#..#..
+...#......#..#.#...............
+#......###....#.#..#.#..#....#.
+#.#.####.#.........#..#.#.#....
+.....#....#...............#...#
+.#........#......#.#...#.......
+................#...#.....##...
+.............#...####..........
+.................##....##.###..
+#................#......#......
+.###.#........#..##.....#..###.
+..#.#..#...#..#.#...#.#.....#.#
+.....#............#..##..#..#.#
+#........##.#...#.....#........
+#.#.#..###......###............
+...#..#...........##...#.....#.
+......#........#...#.#....#....
+....#..........#.#..#.#....##..
+...#.....##..#......#.#.##...#.
+.........#..#................#.
+..#....#.##.....#.......#......
+...#.....#.......##.##.....#...
+#...#..............#..###..#...
+#.#......#.#....#........##..#.
+...#...##...##..#.........#....
+..#...#......##.#.#.#....##....
+#.......#.......#..#..#........
+.........#..#.....#....#.....##
+.#......#.......#.#..#..#...#.#
+..#....#.#..#..................
+#.....####..........#.#.....#.#
+.#..#.#.#....#.#.....#.#.......
+....##......#..#.....#.#.#...#.
+...##...#......##.#....##.#....
+..#..##....#...#...........#...
+.......#........#...##.#.......
+#.#..#....##.#....##...........
+.......#............#..##..##..
+#.#.#.....#....##.#.#.#.....#..
+##...#...#.......#..#...#.....#
+##..##.##..........#........##.
+..............#.....#..#..##...
+.......#...#.........#....#.#..
+...#..#..#....#.#....##........
+..#.......#....#....##.........
+#...#.....#..#.#...##....#.....
+.....##..#..##..#..............
+.....##............#....#.#....
+..#.....#....##.#.....#..#.....
+#...#..#..#......#.#.#..##.....
+.............................##
+#...#.#................#....#.#
+.#.#.#....##......###..##......
+#.....#..#.##.#.#.##...###.....
+.........#............##..#....
+.#..#...#....#.....#.#........#
+...............#......#..#.....
+...................###........#
+.###..##..##.......#.#.........
+#.........#......#....#.#...#..
+.#.#....#.......#.#..##...##...
+.#.....#....##.......#.#.....#.
+.........#...#....#.#..........
+....###..#..##.#...##....#..#..
+...#.#..##.#.........###.#..#..
+#...#...........#....#.........
+....##...........#.#.#......###
+#....#...........##..#.........
+###....#.....#.......#....###..
+.#.......#....#.#.#.#......#.#.
+........#...............#.#.#..
+....#.........#.....#...##.##.#
+...#............#.............#
+..........#..#.................
+........#.....##............#.#
+..#...##........#...#.....#.#..
+....#........#.#.#..........#..
+#.#...#...........#............
+....#.#...##...........#.....#.
+...........#.#..#.....#........
+.....#..#..#..#.....#.#.....#.#
+#.....#.......#.......#...#....
+#.........#....#.#........#..#.
+...#..#.........#.....#..#.....
+...#..#.............#..........
+.#.......#..........#.....#...#
+.....#.#......#.......#....#...
+...#.....#..#..##....##....#...
+.#.#.#..#...#.....#....#.......
+..##.#..........#.....#.#......
+..#..#.............#...##..##..
+.#.............#..#....##...#..
+..#...#.....#.................#
+..##.......#.....#...#....#....
+.#..#.##.........#...#.#...#...
+...##.......##..#.....##.##...#
+........####.#.........#.......
+..#.#...##.#..#..#.......##.#..
+.#..#............###..#..#.....
+#.....#.#...#.#.......#........
+..........#......#.#...#...#...
+..#......#..#..#.#...#.........
+..###........#.#....#.#...##...
+.#.....#..#.#......#........#..
+.#...#..#...#....#.......#..#..
+..#....#..#.....#.#........#...
+#..#.#.........#..........#..#.
+.#.....##....#.........#.#.#.#.
+#.#...#.....#.#.#....#.#..#....
+.........#...................#.
+..#.....#..##...#..........#.#.
+..............#....#.........#.
+.#....#.....#..............##..
+#...#...#.#........##.........#
+....###....#.#....#.#.........#
+.....#........#.....##.........
+.#...##..##..#.........##......
+............#.....#........#...
+..#....#.......#......#..#.#.#.
+#.......#.#...........#..##.#..
+......#.##......#....#.......#.
+.....#........#...###.....#....
+###..........#........#.#.#....
+.....#...#.#...#...#...##.....#
+.##...#.#........#.#....#......
+......#.........#.....#.#......
+.....#.##.....###.#...#...##..#
+.#.#.......##....#..#..#.##....
+.####...###.#.#.#.#............
+......#..##...#..........#.##.#
+......#............#...........
+.....#.#..#.......##...##......
+......#........#..#....#.#.#.#.
+#..#..#.....#..#.....#.......#.
+.#...#.....#..............#....
+.#....#..#.##.#............####
+..........#....#.##...#.#......
+...#.#.#.#.#.......#.........#.
+##........#..##..#.........#...
+..#......#...#..#.#.....#......
+..#.#......#...#...#.#.........
+........................##.....
+...#.##.#........#...#.......#.
+..#.#......#....##........#.#..
+#......#.##........#..#......#.
+.....#..#..#.............#.....
+......#......#........#....#...
+...#....###.....#..#.#....#....
+#.......................#....#.
+..#...#...................#....
+....#..#.....##.#..#...#.....#.
+...#.........#...#.......#.....
+..#....#.....#...#...#.#####...
+.....####......#...........#...
+......#.#..........#...#.#.#..#
+###..#.#....#..#...............
+...#...###..#..#.#.#...........
+.....#...#.##.#.#.###..##......
+.........#...........#....##.#.
+....#..#......#................
+...........#..#..#...#.#.......
+..#.....#......##.###..........
+.........#...................#.
+..........#...#.#....##........
+..#...##....#....#.......#...##
+#......#.....#...#...#...#.....
+....##...#.#.......#.#...##....
+...#.....#....#.....#....#.....
+#....##.....##..##..........##.
+.....#.....#.#.#...............
+.#.##....#.....#.#..#....#..##.
+.....#.#.....##....#...........
+.........#..#.......##..##.....
+..#....##.....###...#....#.#...
+............#......#.#...#..#..
+#..##......#.#.##....#.#.......
+.#.#.....#...#.#.#....#.....#..
+#....#..#.#....#...#...........
+......#.#.....#...#.#.#......#.
+###..#....#.###.............#..
+..............#####........###.
+..#..#.#.#.#......#......#.....
+###.........#.#..........#..#.#
+.#.........#...#......####.....
+..#.......####..#....#...#..#..
+#.#..#.#...............#.#.#.#.
+###....#.....##.#....#......##.
+..#..#........#....###.#.#.....
+...#.#..........#.....#...#....
+....#......##.#............#..#
+...##...#.....#..##....#..#.#.#
+.......#.....#..#....#....##.#.
+.#..#....#..#......##....##...#
+..#......#...#.#..###..#.##....
+#...#.....#......##...#.......#
+.....#.#.....#...##............
+.#..##.##..#..##.#........#....
+....#.#......##...#.#.#.#..##..
+.#..............##........#....
+.##....#..#..#....#...#......#.
+............###....##.......##.
+..............####.....#.......
+........##..##.#...#.......#...
+....#..#.....##.......#####...#
+.##..##..#.....#...#..#..#....#
+##..#.#.#...........#..........
+#..#......#...#....#...........
+...#..##.#..........#..#.......
+........#.#.....#......##......
+.....#....#............#.......
+.#.#..#....##......#.......###.
+.#..#.#........#......#...##..#
+...#....#......#..#........#.##
+.........#..#...#..#.#.##......
+....###.#...........#...#......
+.##............#.......#..##...
+##...#.#...............#.#...##
+..#..#.....#.#..#..#...........
+..#..#.##..#......#.##..#.#....
+..#...#......#.#...#....##.#...
+...###....####......#....#...#.
+.......##........#.....##....#.
+.........##..........#...#.....
+.....#............#.##.#....#.#
+..........#...#....##..........
+....................#......#...
+#......#..#...#.............##.
+...........#...................
+..#...#.........#.##.#..##.#...
+#.#....#.#.....#............#..
+.#..#.....#.....####......#.#..
+#....#.......##..#...........#.
+............#...#.....#..#.#...
+#...........#...#####....#...#.
+..........#...###..##.........#
+#.....###............#..#..#.#.
+...##.....#....#......#.....#..
+#....#.......#..#......###...#.
+...##.##......##..##..........#
+.......#.#..#.#..#.#.#.#..#..#.
+..#..###...#....#.....#......#.
+...#.........#..#.##.#.....###.
+..#.........#.##.#..#..#..###..
+..####..#.........#.........#.#
+..#.#...#.......#....##........
+.#......#.#....................
+..........#.......#.#..#..#....
+..#........#....#.#..#.........
+..#.....#.............#....#...
+##...#.........#.....#...#.....
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)