summaryrefslogtreecommitdiffstats
path: root/2021/10/code.tl
blob: 4e020cb0ace35ebd3de20837d281588464bce0d7 (plain)
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
(defun corrupt (str)
  (if-match (@pos . @len) (search-str-tree str '("(]" "(}" "(>"
                                                 "[)" "[}" "[>"
                                                 "{)" "{]" "{>"
                                                 "<)" "<]" "<}"))
    pos))

(defun reduxe (str)
  (while-match (@pos . @len) (search-str-tree str '("()" "[]" "{}" "<>"))
    (del [str pos..(ssucc pos)]))
  str)

(defun solve-part-one (: (name "input"))
  (with-stream (s (open-file name))
    (let ((score 0))
      (whilet ((line (get-line s)))
        (let ((rline (reduxe line)))
          (iflet ((pos (corrupt rline)))
            (inc score
                 (ecaseq [rline (succ pos)]
                   (#\) 3)
                   (#\] 57)
                   (#\} 1197)
                   (#\> 25137))))))
      score)))

(defun solve-part-two (: (name "input"))
  (flow
    (file-get-lines name)
    (mapcar reduxe)
    (remove-if [orf corrupt empty])
    (mapcar (opip (mapcar (relate "([{<" #(1 2 3 4)))
                  (rpoly 5)))
    (sort)
    [callf ref use [chain len (lop trunc 2)]]))