Day 3: Mull It Over

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

    Just did some basic regex stuff.

    Part 1 and 2
    
    (defun p1-mult (str)
      "pulls out numbers and multiplies them, assumes already filtered by size"
      (let ((vals (ppcre:all-matches-as-strings "\\d+" str)))
        (apply #'* (or (mapcar #'parse-integer vals) '(0)))))
    
    (defun p1-process-line (line)
      "look for mul, do the mul, and sum"
      (let ((ptrn "mul\\(\\d?\\d?\\d,\\d?\\d?\\d\\)"))
        (apply #'+ (mapcar #'p1-mult (ppcre:all-matches-as-strings ptrn line)))))
    
    (defun run-p1 (file) 
      (let ((data (read-file file #'p1-process-line)))
        (apply #'+ data)))
    
    (defun p2-process-line (line)
      "looks for mul, do, and don't"
      (let ((ptrn "(mul\\(\\d?\\d?\\d,\\d?\\d?\\d\\))|(do\\(\\))|(don't\\(\\))"))
        (ppcre:all-matches-as-strings ptrn line)))
    
    (defun p2-filter (data)
      "expects list containing the string tokens (mul, do, don't) from the file"
      (let ((process t))
        (loop for x in data
              when (string= "don't()" x)
                do (setf process nil)
              when (string= "do()" x)
                do (setf process t)
              when process
                sum (p1-mult x))))
    
    (defun run-p2 (file) 
      (let ((data (read-file file #'p2-process-line)))
        ;; treat the input as one line to make processing the do's and don't's easier
        (p2-filter (flatten data))))