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