aboutsummaryrefslogtreecommitdiff
path: root/racket/aoc2022/day-07/day-07.rkt
blob: 3826cc4a6ed97812f62d6a26d5612fbd1a28541e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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 (string-split cmd)
      [(list "$" "ls") (values folders current-path (hash-has-key? folders current-path))]
      [(list "$" "cd" "/") (values folders '("/") #false)]
      [(list "$" "cd" "..") (values folders (rest current-path) #false)]
      [(list "$" "cd" folder) (values folders (cons folder current-path) #false)]
      [(list "dir" _) (values folders current-path previously-seen?)]
      [(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))