Current implementation of puzzle-7
Not complete, dunno what to do for parsing and handling CD commands.
This commit is contained in:
47
2022/puzzle-7.lisp
Normal file
47
2022/puzzle-7.lisp
Normal file
@@ -0,0 +1,47 @@
|
||||
(load "lib")
|
||||
(defparameter input (uiop:read-file-string "7-input"))
|
||||
(defparameter lines (get-lines input)) ;; first line is ALWAYS "$ cd /"
|
||||
|
||||
(defun tokenise-lines (lines)
|
||||
"Split each LINE in LINES by space"
|
||||
(mapcar (lambda (line)
|
||||
(mapcar #'clist-to-string
|
||||
(split-completely (string-to-clist line) #\Space)))
|
||||
lines))
|
||||
|
||||
(defun token-cmdp (token)
|
||||
"Checks if TOKEN is a command (by the first member)"
|
||||
(string= (car token) "$"))
|
||||
|
||||
(defun till-next-cmd (tokens)
|
||||
"Iterates over TOKENS till a command is found, returning the remaining
|
||||
tokens (including command)."
|
||||
(loop
|
||||
for token-set on tokens
|
||||
if (token-cmdp (car token-set))
|
||||
return token-set))
|
||||
|
||||
(defun parse-ls (tokens)
|
||||
"Converts the following TOKENS till a command (via TOKEN-CMDP) into a
|
||||
directory structure i.e. an alist of string names by their content."
|
||||
(loop for token in tokens
|
||||
until (token-cmdp token)
|
||||
collect
|
||||
(let ((size (car token))
|
||||
(name (cadr token)))
|
||||
(if (string= size "dir")
|
||||
`(,name . nil)
|
||||
`(,name . ,(parse-integer size))))))
|
||||
|
||||
(defun parse-tokens (tokens)
|
||||
(if (token-cmdp (car tokens))
|
||||
(cond
|
||||
((string= (cadar tokens) "ls")
|
||||
(values
|
||||
(till-next-cmd (cdr tokens))
|
||||
(parse-ls (cdr tokens))))
|
||||
((string= (cadar tokens) "cd")
|
||||
;; TODO: Actually figure out what I should do here
|
||||
(values
|
||||
(cdr tokens)
|
||||
nil)))))
|
||||
Reference in New Issue
Block a user