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