-
Notifications
You must be signed in to change notification settings - Fork 0
/
day10.lisp
47 lines (41 loc) · 1.34 KB
/
day10.lisp
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
(eval-when (:compile-toplevel :load-toplevel :execute)
(load "/Users/jeff/Projects/advent/common/common.lisp"))
(defun corrupted-score (c)
(case c
((#\)) 3)
((#\]) 57)
((#\}) 1197)
((#\>) 25137)))
(defun incomplete-score (c)
(case c
((#\() 1)
((#\[) 2)
((#\{) 3)
((#\<) 4)))
(defun parse-chunks (s)
(loop
with stack = nil
for c across s
do (if (member c '(#\[ #\( #\{ #\<))
(push c stack)
(unless (case (pop stack)
((#\() (char= c #\)))
((#\[) (char= c #\]))
((#\{) (char= c #\}))
((#\<) (char= c #\>)))
(return-from parse-chunks (corrupted-score c))))
finally (return stack)))
(defun autocomplete (stack)
(loop
with score = 0
for top in stack
do (setf score (+ (* score 5) (incomplete-score top)))
finally (return score)))
(defun part-1 (&optional (data #'test-data))
(time (let ((errors (funcall data #'parse-chunks)))
(loop for e in errors when (numberp e) sum e))))
(defun part-2 (&optional (data #'test-data))
(time (let* ((chunks (funcall data #'parse-chunks))
(incomplete (remove-if #'numberp chunks))
(scores (map 'vector #'autocomplete incomplete)))
(aref (sort scores #'<) (truncate (length scores) 2)))))