;;; solver.el --- Day 07 -*- lexical-binding: t; -*- ;; ;; Copyright (C) 2022 Óscar Nájera ;; ;; Author: Óscar Nájera ;; Maintainer: Óscar Nájera ;; 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