Add day 12
[adventofcode2020.git] / src / day03.lisp
1 (asdf:load-system :adventofcode2020)
2 (in-package #:adventofcode2020)
3 (named-readtables:in-readtable fn-reader)
4
5 (defun tree-collisions (slope tree-map)
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= #\#))))
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))
23 (mapcar λ(tree-collisions _ tree-map))
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)
48 (mapcar λ(tree-collisions _ '("..##......."
49 "#...#...#.."
50 ".#....#..#."
51 "..#.#...#.#"
52 ".#...##..#."
53 "..#.##....."
54 ".#.#.#....#"
55 ".#........#"
56 "#.##...#..."
57 "#...##....#"
58 ".#..#...#.#"))
59 '((1 1) (1 3) (1 5) (1 7) (2 1))))))
60
61 (run! 'day03)