adventofcode2022

My solutions for Advent of Code 2022
Log | Files | Refs

day04.lisp (1263B)


      1 (defpackage #:adventofcode2022/day04
      2   (:use #:cl #:adventofcode2022))
      3 (in-package #:adventofcode2022/day04)
      4 
      5 (defun range-contains-p (begin-1 end-1 begin-2 end-2)
      6   (or (and (>= begin-1 begin-2) (<= end-1 end-2))
      7       (and (>= begin-2 begin-1) (<= end-2 end-1))))
      8 
      9 (defun range-intersects-p (begin-1 end-1 begin-2 end-2)
     10   (and (<= begin-1 end-2)
     11        (<= begin-2 end-1)))
     12 
     13 (defun task1 (inputs)
     14   (loop for input in inputs
     15         when (range-contains-p
     16               (caar input)
     17               (cdar input)
     18               (cadr input)
     19               (cddr input))
     20           sum 1))
     21 
     22 (defun task2 (inputs)
     23   (loop for input in inputs
     24         when (range-intersects-p
     25               (caar input)
     26               (cdar input)
     27               (cadr input)
     28               (cddr input))
     29           sum 1))
     30 
     31 (define-day 4
     32     (:translate-input (lambda (line)
     33                         (let* ((pair (str:split "," line))
     34                                (range-1 (str:split "-" (car pair)))
     35                                (range-2 (str:split "-" (cadr pair))))
     36                           `((,(parse-integer (car range-1)) . ,(parse-integer (cadr range-1))) .
     37                             (,(parse-integer (car range-2)) . ,(parse-integer (cadr range-2)))))))
     38   #'task1
     39   #'task2)