Commit | Line | Data |
---|---|---|
75918e33 | 1 | (asdf:load-system :adventofcode2020) |
37dc4d4e | 2 | (in-package #:adventofcode2020) |
a7a78c7a | 3 | (named-readtables:in-readtable fn-reader) |
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) |