: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))))
-; (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))
--- /dev/null
+(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)