Use the ASDF system properly and update template
[adventofcode2020.git] / src / day03.lisp
CommitLineData
75918e33 1(asdf:load-system :adventofcode2020)
37dc4d4e
JK
2(in-package #:adventofcode2020)
3
4(defun tree-collisions (slope tree-map)
5 (destructuring-bind (rise run) slope
6 (loop with terrain-width = (-> tree-map first length)
7 for i upfrom 0 by run
8 for j upfrom 0
9 for terrain-line in tree-map
10 when (->> rise (mod j) (= 0))
11 counting (->> terrain-width
12 (mod i)
13 (char terrain-line)
14 (char= #\#)))))
15
16(day 03 input
17 (let ((tree-map (list-from input)))
18 (part1 (tree-collisions '(1 3) tree-map))
19 (part2 (->> '((1 1) (1 3) (1 5) (1 7) (2 1))
20 (mapcar (fn* (tree-collisions _ tree-map)))
21 (reduce #'*)))))
22
23(def-suite day03)
24(in-suite day03)
25
26(test single-collision-check
27 (is (equal
28 7
29 (tree-collisions '(1 3) '("..##......."
30 "#...#...#.."
31 ".#....#..#."
32 "..#.#...#.#"
33 ".#...##..#."
34 "..#.##....."
35 ".#.#.#....#"
36 ".#........#"
37 "#.##...#..."
38 "#...##....#"
39 ".#..#...#.#")))))
40
41
42(test multiple-collision-check
43 (is (equal
44 '(2 7 3 4 2)
45 (mapcar (fn* (tree-collisions _ '("..##......."
46 "#...#...#.."
47 ".#....#..#."
48 "..#.#...#.#"
49 ".#...##..#."
50 "..#.##....."
51 ".#.#.#....#"
52 ".#........#"
53 "#.##...#..."
54 "#...##....#"
55 ".#..#...#.#")))
56 '((1 1) (1 3) (1 5) (1 7) (2 1))))))
57
58(run! 'day03)