day 4: number intervals overlap
This commit is contained in:
parent
ce89746131
commit
a0f3c07e06
|
@ -0,0 +1,71 @@
|
||||||
|
;;; https://adventofcode.com/2022/day/4
|
||||||
|
|
||||||
|
;; so, just read two intervals.
|
||||||
|
;; intervals , separated, two numbers - separated.
|
||||||
|
;; so. ugh. have a parsing function. maybe ask how to better parse
|
||||||
|
;; then to calculate "total inclusion" - can go both ways, so 4 checks
|
||||||
|
|
||||||
|
(setq test-line "2-4,6-8")
|
||||||
|
(setq test-line "2-8,3-7")
|
||||||
|
|
||||||
|
(require 'cl-ppcre)
|
||||||
|
;; (cl-ppcre:split "(\\ )" line :with-registers-p nil)
|
||||||
|
(setq intervals (mapcar #'parse-integer (cl-ppcre:split "(,|-)" test-line)))
|
||||||
|
|
||||||
|
(defun line-to-nums (line)
|
||||||
|
(mapcar #'parse-integer (cl-ppcre:split "(,|-)" line)))
|
||||||
|
|
||||||
|
(defun first-includes-second (l1 r1 l2 r2)
|
||||||
|
(and (<= l1 l2) (>= r1 r2)))
|
||||||
|
|
||||||
|
(first-includes-second 2 8 3 7)
|
||||||
|
(first-includes-second 3 8 3 7)
|
||||||
|
(first-includes-second 4 8 3 7)
|
||||||
|
|
||||||
|
(defun first-or-last-includes-another (l1 r1 l2 r2)
|
||||||
|
(or (first-includes-second l1 r1 l2 r2)
|
||||||
|
(first-includes-second l2 r2 l1 r1)))
|
||||||
|
|
||||||
|
(with-open-file (in-file "day4-test-input.txt")
|
||||||
|
(let ((running-count 0))
|
||||||
|
(loop
|
||||||
|
for line = (read-line in-file nil nil)
|
||||||
|
while line
|
||||||
|
do (if (apply #'first-or-last-includes-another (line-to-nums line))
|
||||||
|
(incf running-count 1))
|
||||||
|
finally (return running-count))))
|
||||||
|
|
||||||
|
(defun count-full-interlaps (filename)
|
||||||
|
(with-open-file (in-file filename)
|
||||||
|
(let ((running-count 0))
|
||||||
|
(loop
|
||||||
|
for line = (read-line in-file nil nil)
|
||||||
|
while line
|
||||||
|
do (if (apply #'first-or-last-includes-another (line-to-nums line))
|
||||||
|
(incf running-count 1))
|
||||||
|
finally (return running-count)))))
|
||||||
|
|
||||||
|
(count-full-interlaps "day4-test-input.txt")
|
||||||
|
(count-full-interlaps "day4-input.txt")
|
||||||
|
|
||||||
|
;; next part - count intervals that "overlap at all", even if by single point
|
||||||
|
;; could count 'not overlapping' - should be very easy
|
||||||
|
;; and count total, and deduct
|
||||||
|
|
||||||
|
(defun count-any-overlap (filename)
|
||||||
|
(with-open-file (in-file filename)
|
||||||
|
(let ((running-count-non-overlap 0)
|
||||||
|
(total-count 0))
|
||||||
|
(loop
|
||||||
|
for line = (read-line in-file nil nil)
|
||||||
|
while line
|
||||||
|
do (let ((nums (line-to-nums line)))
|
||||||
|
(if (or (< (second nums) (third nums))
|
||||||
|
(< (fourth nums) (first nums)))
|
||||||
|
(incf running-count-non-overlap 1))
|
||||||
|
(incf total-count 1)
|
||||||
|
)
|
||||||
|
finally (return (- total-count running-count-non-overlap))))))
|
||||||
|
|
||||||
|
(count-any-overlap "day4-test-input.txt")
|
||||||
|
(count-any-overlap "day4-input.txt")
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,6 @@
|
||||||
|
2-4,6-8
|
||||||
|
2-3,4-5
|
||||||
|
5-7,7-9
|
||||||
|
2-8,3-7
|
||||||
|
6-6,4-6
|
||||||
|
2-6,4-8
|
Loading…
Reference in New Issue