adventofcode2022

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

commit a42c098253c0b4a234ebc0444cc100e19fdfa9c0
parent 904fe53545fc791e4a7ad69b514b0c06bf7fa583
Author: Lukas Henkel <lh@entf.net>
Date:   Sat,  3 Dec 2022 09:38:54 +0100

Day 3 task 2

Diffstat:
Msrc/day03.lisp | 52+++++++++++++++++++++++++++++++++++++++-------------
Mt/day03.lisp | 5+++++
2 files changed, 44 insertions(+), 13 deletions(-)

diff --git a/src/day03.lisp b/src/day03.lisp @@ -2,29 +2,55 @@ (:use #:cl #:adventofcode2022)) (in-package #:adventofcode2022/day03) +(defun calculate-priority (result) + (if (char>= result #\a) + (- (char-code result) 96) + (- (char-code result) 38))) + (defun task1 (inputs) (loop for input in inputs - sum (let ((compartment1 (car input)) - (compartment2 (cdr input)) - (result)) + sum (let* ((compartment-size (/ (length input) 2)) + (compartment1 (subseq input 0 compartment-size)) + (compartment2 (subseq input compartment-size)) + (result)) (loop for item1 across compartment1 for item2 across compartment2 - when (find item1 compartment2 :test #'equal) + when (find item1 compartment2) do (progn (setf result item1) (loop-finish)) - when (find item2 compartment1 :test #'equal) + when (find item2 compartment1) do (progn (setf result item2) (loop-finish))) - (if (char>= result #\a) - (- (char-code result) 96) - (- (char-code result) 38))))) + (calculate-priority result)))) + +(defun all-chars-from-to (from to) + (loop for i from (char-code from) to (char-code to) + collect (code-char i))) + +(defun task2 (inputs) + (let* ((items (concatenate 'list + (all-chars-from-to #\A #\Z) + (all-chars-from-to #\a #\z))) + (group) + (groups (loop for i from 1 + for elf in inputs + do (push elf group) + when (= (mod i 3) 0) + collect group and do (setf group nil)))) + (loop for group in groups + sum (let ((result)) + (loop for item in items + when (= 0 (length (remove-if (lambda (elf) + (find item elf)) + group))) + do (progn + (setf result item) + (loop-finish))) + (calculate-priority result))))) (define-day 3 - (:translate-input (lambda (line) - (let ((compartment-size (/ (length line) 2))) - (cons (subseq line 0 compartment-size) - (subseq line compartment-size))))) + () #'task1 - nil) + #'task2) diff --git a/t/day03.lisp b/t/day03.lisp @@ -13,3 +13,8 @@ CrZsJsPPZsGzwwsLwLmpwMDw") (run-task 3 1 (make-string-input-stream +testdata-day03+))))) +(def-test day03-task2 () + (is-true + (= 70 + (run-task 3 2 + (make-string-input-stream +testdata-day03+)))))