about summary refs log tree commit diff
path: root/day07.rkt
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2022-12-08 17:36:38 +0100
committerLeah Neukirchen <leah@vuxu.org>2022-12-08 17:36:38 +0100
commit4a49127af3b9fb548dbfa5c55fdc8e15b180eb80 (patch)
treeb46e60731a5056cd2b5caf76cea7e232cf5c0df2 /day07.rkt
parentf4bb1b6ca10ad9c7c2479152ce99aa603d0eea02 (diff)
downloadadventofcode2022-4a49127af3b9fb548dbfa5c55fdc8e15b180eb80.tar.gz
adventofcode2022-4a49127af3b9fb548dbfa5c55fdc8e15b180eb80.tar.xz
adventofcode2022-4a49127af3b9fb548dbfa5c55fdc8e15b180eb80.zip
day07
Diffstat (limited to 'day07.rkt')
-rw-r--r--day07.rkt52
1 files changed, 52 insertions, 0 deletions
diff --git a/day07.rkt b/day07.rkt
new file mode 100644
index 0000000..7bcb3ca
--- /dev/null
+++ b/day07.rkt
@@ -0,0 +1,52 @@
+#lang racket
+
+(define data (file->lines "day07"))
+
+(define fs (make-hash))
+(let loop ([data (cdr data)]
+           [cwd '()])
+  (let ([cmd (car data)]
+        [rest (cdr data)])
+    (cond [(string-prefix? cmd "$ cd")
+           (let ([dir (third (string-split cmd " "))])
+             (if (equal? dir "..")
+               (loop rest (cdr cwd))
+               (loop rest (cons dir cwd))))]
+          [(equal? cmd "$ ls")
+           (let dir-loop ([dir-list rest])
+             (if (null? dir-list)
+               (void)                   ; done
+               (let ([line (car dir-list)]
+                     [dir-rest (cdr dir-list)])
+                 (cond [(string-prefix? line "$")
+                        (loop (cons line dir-rest) cwd)] ; push back line
+                       [(string-prefix? line "dir")
+                        (dir-loop dir-rest)] ; ignore
+                       [else
+                        (let* ([fields (string-split line " ")]
+                               [size (string->number (first fields))])
+                          (let segment-loop ([dir cwd])
+                            (hash-update! fs
+                                          (string-join (reverse dir) "/" #:before-first "/")
+                                          (curry + size)
+                                          0)
+                            (unless (null? dir)
+                              (segment-loop (cdr dir))))
+                          (dir-loop dir-rest))]))))]
+          [else (error "invalid line")])))
+
+(for/sum ([(dir size) fs])
+  (if (<= size 100000)
+    size
+    0))
+; 1306611
+
+(let* ([total (hash-ref fs "/")]
+       [unused (- 70000000 total)]
+       [needed (- 30000000 unused)])
+  (for/fold ([smallest total])
+            ([(dir size) fs])
+    (if (>= size needed)
+      (min smallest size)
+      smallest)))
+; 13210366