;;; 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 NIL)) (current-folder folders)) (defun parse-cd (loc) (cond ((string= loc "/") (setf current-folder folders)) ((string= loc "..") (let ((working-fold folders)) (loop for ind in (third current-folder) until (cdr (third current-folder)) do (setf working-fold (nth ind working-fold))) (setf current-folder working-fold))) (t (setf current-folder (first (member-if (lambda (x) (string= (first x) loc)) (nthcdr 3 current-folder))))))) (defun parse-dir (name) (push-back (list name ; name 0 ; sum of size of all files (append (third current-folder) ; location instructions for parent (list (- (length current-folder) 1)))) current-folder)) (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)) (+= (second current-folder) (parse-integer inpt :junk-allowed T)))) (print current-folder) (force-output)) (print folders)))