aboutsummaryrefslogtreecommitdiffstats
path: root/assets/scss/tachyons.css
diff options
context:
space:
mode:
Diffstat (limited to 'assets/scss/tachyons.css')
0 files changed, 0 insertions, 0 deletions
href='#n80'>80 81 82 83
;;; 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)
(require 'subr-x)

(ert-deftest test-solver ()
  (with-temp-buffer
    (insert-file-contents "input")
    (let* ((dir-sizes
            (thread-first
              (split-string (buffer-string) "\n")
              (solver-parse-listing)
              (solver-aggregate-size)))
           (total-disk 70000000)
           (free-disk (- total-disk (cadr dir-sizes)))
           (needed 30000000)
           (to-free (- needed free-disk)))
      (should (= 1845346 (solver-add-dir-size dir-sizes)))
      (should (= 3636703 (solver-delete-what dir-sizes to-free))))))


(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-aggregate-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)))

    (flatten-tree (combiner tree))))

(defun solver-add-dir-size (sizes)
  (cl-loop for (_ size) on sizes by #'cddr
           when (< size 100000)
           sum size))

(defun solver-delete-what (sizes required)
  (cl-loop for (_ size) on sizes by #'cddr
           when (> size required)
           minimizing size))

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