-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path25.el
More file actions
87 lines (77 loc) · 1.8 KB
/
25.el
File metadata and controls
87 lines (77 loc) · 1.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
(require 'dash)
(defun read-input (file-path)
(with-temp-buffer
(insert-file-contents file-path)
(buffer-string)))
(defun parse-item (item-string)
(let* ((matrix (--> item-string
(split-string it "\n" t)
(--map (seq-into it 'vector) it)
(seq-into it 'vector)))
(height (length matrix))
(width (if (zerop height) 0 (length (aref matrix 0))))
runs shape min-h)
(dotimes (i width)
(push (->> (--map (aref (aref matrix it) i) (-iota height))
((lambda (column) (-let [head (car column)]
(list head
(length (--filter (= it head) column))
(length (--filter (not (= it head)) column)))))))
runs))
(setq runs (nreverse runs))
(setq shape (cond
((--all? (= ?# (car it)) runs) (cons :lock (-map #'cadr runs)))
((--all? (= ?. (car it)) runs) (cons :key (-map #'caddr runs)))))
(dotimes (i width)
(cl-decf (nth (1+ i) shape)))
shape))
(defun parse-input (input-string)
(--> input-string
(split-string it "\n\n" t)
(-map #'parse-item it)))
(defun part1 (input)
(-let [ans 0]
(dolist (lock (--filter (eq :lock (car it)) input))
(dolist (key (--filter (eq :key (car it)) input))
(-let [heights (-zip-with #'+ (cdr lock) (cdr key))]
(when (>= 5 (-max heights))
(cl-incf ans)))))
ans))
(setq example (parse-input "
#####
.####
.####
.####
.#.#.
.#...
.....
#####
##.##
.#.##
...##
...#.
...#.
.....
.....
#....
#....
#...#
#.#.#
#.###
#####
.....
.....
#.#..
###..
###.#
###.#
#####
.....
.....
.....
#....
#.#..
#.#.#
#####"))
(setq input (parse-input (read-input "25.txt")))
(part1 input)