From 6296e77658d2c5508d32d5a1500b582fb6b5def9 Mon Sep 17 00:00:00 2001 From: Hunky Jimpjorps Date: Wed, 7 Dec 2022 08:16:16 -0500 Subject: day 7 complete --- 2022/day-07/day-07.rkt | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 2022/day-07/day-07.rkt (limited to '2022') diff --git a/2022/day-07/day-07.rkt b/2022/day-07/day-07.rkt new file mode 100644 index 0000000..4ebd3b4 --- /dev/null +++ b/2022/day-07/day-07.rkt @@ -0,0 +1,36 @@ +#lang racket + +(require advent-of-code + fancy-app + threading + (only-in relation ->number)) + +(define command-output (~> (fetch-aoc-input (find-session) 2022 7) (string-split "\n"))) + +(define (parse-commands cmds) + (define (update-sizes h path size) + (match path + ['() h] + [(list* _ fs) (update-sizes (hash-update h path (+ _ size) 0) fs size)])) + + (for/fold ([folders (hash)] [current-path '()] [previously-seen? #false] #:result folders) + ([cmd (in-list cmds)]) + (match cmd + ["$ ls" (values folders current-path (hash-has-key? folders current-path))] + ["$ cd /" (values folders '("/") #false)] + ["$ cd .." (values folders (rest current-path) #false)] + [(regexp #px"\\$ cd (.+)" (list _ folder)) (values folders (cons folder current-path) #false)] + [(regexp #px"dir (.+)") (values folders current-path previously-seen?)] + [(regexp #px"(.+) (.+)" (list _ (app ->number size) _)) + (cond + [previously-seen? (values folders current-path previously-seen?)] + [else (values (update-sizes folders current-path size) current-path previously-seen?)])]))) + +(define folders (parse-commands command-output)) + +;; part 1 +(for/sum ([(_ v) (in-hash folders)] #:when (<= v 100000)) v) + +;; part 2 +(define required-to-delete (- 30000000 (- 70000000 (hash-ref folders '("/"))))) +(~>> folders hash-values (filter (> _ required-to-delete)) (apply min)) -- cgit v1.2.3