aboutsummaryrefslogtreecommitdiffstats
path: root/AoC2022/07/solver.el
blob: 38354ff65e83e185e9628af9c63c020e16eab5af (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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
;;; solver.el --- Day 07 -*- lexical-binding: t; -*-
;;
;; Copyright (C) 2022 Óscar Nájera
;;
;; Author: Óscar Nájera <hi@oscarnajera.com>
;; Maintainer: Óscar Nájera <hi@oscarnajera.com>
;; Created: December 08, 2022
;; Modified: December 08, 2022
;;
;; This file is not part of GNU Emacs.
;;
;;; Commentary:
;;
;;  Day 07
;;
;;; Code:


(require 'cl-lib)

  (insert "$ cd /
$ ls
dir a
14848514 b.txt
8504156 c.dat
dir d
$ cd a
$ ls
dir e
29116 f
2557 g
62596 h.lst
$ cd e
$ ls
584 i
$ cd ..
$ cd ..
$ cd d
$ ls
4060174 j
8033020 d.log
5626152 d.ext
7214296 k")

(with-temp-buffer
  (insert-file-contents "input")
  (solver-add-dir-size
   (solver-parse-listing (split-string (buffer-string) "\n"))))

(defun solver-parse-listing (lines)
  (cl-labels ((scan ()
                    (cl-loop for item = (pop lines)
                             while (and item (not (string= "$ cd .." item)))
                             when (parse item)
                             collect it))
              (parse (entry)
                     (pcase (split-string entry)
                       (`("$" "cd" ,dir) (cons dir (scan)))
                       (`("$" "ls") nil)
                       (`("dir" ,dir) nil)
                       (`(,size ,name) (cons name (string-to-number size))))))

    (car (scan))))

(defun solver-add-dir-size (tree)
  (cl-labels ((combiner (tri)
                        (list (car tri)
                              (adder tri)
                              (seq-reduce (lambda (acc item)
                                            (if (numberp (cdr item))
                                                acc
                                              (cons (combiner item) acc)))
                                          (cdr tri) nil)))
              (adder (tri)
                     (seq-reduce (lambda (acc item)
                                   (+ acc
                                      (if (numberp (cdr item))
                                          (cdr item)
                                        (adder item))))
                                 (cdr tri) 0)))

    (cl-loop for (_ size) on (flatten-tree (combiner tree)) by #'cddr
             when (< size 100000)
             sum size)))

(provide 'solver)
;;; solver.el ends here