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