(require 'subr-x) (defun solver-subinterval (a0 a1 b0 b1) "Test if [b0;b1] within [a0;a1]" (and (<= a0 b0 ) (>= a1 b1))) (defun solver-subcontained (a0 a1 b0 b1) (or (solver-subinterval a0 a1 b0 b1) (solver-subinterval b0 b1 a0 a1))) (defun solver-overlap (a0 a1 b0 b1) "Test if [b0;b1] overlaps [a0;a1]" (and (<= a0 b1) (<= b0 a1))) (defun solver-sections-fulfills (func line) (apply func (mapcar #'string-to-number (split-string line "[,-]")))) (defun solver-count-according (func) (with-temp-buffer (insert-file-contents "input") (cl-loop for l = (buffer-substring-no-properties (line-beginning-position) (line-end-position)) while (not (string-blank-p l)) count (solver-sections-fulfills func l) do (forward-line)))) (ert-deftest test-problems () (should (= 515 (solver-count-according #'solver-subcontained))) (should (= 883 (solver-count-according #'solver-overlap))))