Day 5: Print Queue

Megathread guidelines

  • Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
  • You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL

FAQ

  • wer2@lemm.ee
    link
    fedilink
    arrow-up
    1
    ·
    5 days ago

    Lisp

    Part 1 and 2
    
    (defun p1-process-rules (line)
      (mapcar #'parse-integer (uiop:split-string line :separator "|")))
    
    (defun p1-process-pages (line)
      (mapcar #'parse-integer (uiop:split-string line :separator ",")))
    
    (defun middle (pages)
      (nth (floor (length pages) 2) pages))
    
    (defun check-rule-p (rule pages)
      (let ((p1 (position (car rule) pages))
            (p2 (position (cadr rule) pages)))
        (or (not p1) (not p2) (< p1 p2))))
    
    (defun ordered-p (pages rules)
      (loop for r in rules
            unless (check-rule-p r pages)
              return nil
            finally
               (return t)))
    
    (defun run-p1 (rules-file pages-file) 
      (let ((rules (read-file rules-file #'p1-process-rules))
            (pages (read-file pages-file #'p1-process-pages)))
        (loop for p in pages
              when (ordered-p p rules)
                sum (middle p)
              )))
    
    (defun fix-pages (rules pages)
      (sort pages (lambda (p1 p2) (ordered-p (list p1 p2) rules)) ))
    
    (defun run-p2 (rules-file pages-file) 
      (let ((rules (read-file rules-file #'p1-process-rules))
            (pages (read-file pages-file #'p1-process-pages)))
        (loop for p in pages
              unless (ordered-p p rules)
                sum (middle (fix-pages rules p))
              )))