aboutsummaryrefslogtreecommitdiff
path: root/2022/Day07/part-one.cl
blob: e1ffecc41a66af892f2a6110c0a0aac6ae92bcb2 (plain) (blame)
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

;;; https://gitlab.com/Syndamia/senzill
(require :senzill)
(use-package :senzill.math)
(use-package :senzill.collections)
(use-package :senzill.io)

(ask-for-stream (prog-input)
  (let* ((folders '("/" 0 0)) (current-folder 0))
    (defun parse-cd (loc)
      (cond ((string= loc "/")
             (setf current-folder 0))
            ((string= loc "..")
             (setf current-folder (nth (+ 2 current-folder) folders))
            (T
             (setf current-folder (position-if (lambda (x) (and (stringp x) (string= x loc)))
                                               current-folder))))))

    (defun parse-dir (name)
      (push-back name folders)
      (push-back 0 folders)               ; sum of size of all files
      (push-back current-folder folders))

    (doread-lines (inpt :read-line-options (prog-input NIL))
                  (cond ((and (char= (char inpt 0) #\$) (char= (char inpt 2) #\c))
                         (parse-cd (subseq inpt 5)))
                        ((char= (char inpt 0) #\d)
                         (parse-dir (subseq inpt 4)))
                        ((digit-char-p (char inpt 0))
                         (+= (nth (+ 1 current-folder) folders) (parse-integer inpt :junk-allowed T))))
                  (print current-folder)
                  (force-output))
    (print folders)))