adventofcode2022

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

commit fbb2c33462d6611b8801e9a3f28d8012f545f9c2
parent 90579a511a64f2a6c89db48afc90203ec110d028
Author: Lukas Henkel <lh@entf.net>
Date:   Sun, 25 Dec 2022 12:56:19 +0100

Day 25

Diffstat:
Madventofcode2022.asd | 6++++--
Ainput/day25.txt | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/day25.lisp | 45+++++++++++++++++++++++++++++++++++++++++++++
At/day25.lisp | 22++++++++++++++++++++++
4 files changed, 173 insertions(+), 2 deletions(-)

diff --git a/adventofcode2022.asd b/adventofcode2022.asd @@ -35,7 +35,8 @@ (:file "day21") (:file "day22") (:file "day23") - (:file "day24"))) + (:file "day24") + (:file "day25"))) (defsystem "adventofcode2022/test" :description "My solutions to the advent of code 2022" @@ -69,4 +70,5 @@ (:file "day21") (:file "day22") (:file "day23") - (:file "day24"))) + (:file "day24") + (:file "day25"))) diff --git a/input/day25.txt b/input/day25.txt @@ -0,0 +1,102 @@ +2=1121==100=22 +22-0==122-1- +10-10-2=012=2=1==1 +1--000-=12- +1=2= +1==--2--22-= +11-=20==-1-211=1-21 +1=2-0200=-012= +10=2--211 +2= +1-= +1==2 +21==-=202=2 +2==1=0==12=11= +1=-00=201=2-== +1-0=0=2=-2-0=-1= +1=2== +2=1202211- +2-=11= +122=01- +20=000=12-210-00-0- +1020=-212002 +110==21100=- +1-=1=11-2-1= +22-=00011=-01-1- +20-2=22 +1=02=01002---=0 +12-==-2==020 +1-22 +10 +2 +20121 +1001--102=- +1=20==011=-= +2100=--1112 +102= +1--=2-20100---1=2- +100=02-2=00010 +2=212-01-1-200--=- +1001121 +1222 +1==-1- +1=1=1---112---2=22 +2--02020--010 +2=02-2-20====12 +2-1=21-2=202=2=2 +1-20=120120-102= +22=-110 +1=0 +212-2=00220102 +1-012--1= +112==0=- +202 +1=22-- +1212=2--20 +2020==0=00=00=- +1==010 +1=-0-201=- +1===0 +10= +122-0-=02 +1=-=12-110--02=1 +1==000=11=1-1121 +12020020-2=0--1220 +12=-2=102=--2-=0- +2==211111=2-=02=0 +121021 +22=-1=2 +1-0-01=-1220==1 +20=122 +1110-0 +2-210==== +2---0=2= +101=1-1- +200=1-00 +1-10--2==1-10 +10=-00=2=0=010-2- +2=00-100=0=1-2- +21==- +101=-0202 +21020-=2102 +2=0-- +1-0-0-0--1= +21220211- +1=01-221=22 +1--=-11= +2212 +1-00022--122=2001 +111 +1=-1-2- +2=21-212122=21=1 +10---0120-220 +11-000=0 +1=220=2-200=20 +1=2=-==0=102-0=-0212 +100- +1--2=11= +20 +1=--0-=20--2=--=- +1==12-10 +1001-=11=-2=11-0 +12--2 diff --git a/src/day25.lisp b/src/day25.lisp @@ -0,0 +1,45 @@ +(defpackage #:adventofcode2022/day25 + (:use #:cl #:adventofcode2022)) +(in-package #:adventofcode2022/day25) + +(defun parse-snafu (string) + (loop with n = 0 + for digit across (reverse string) + for m = 1 then (* m 5) + do (incf n (* m (case digit + (#\2 2) + (#\1 1) + (#\- -1) + (#\= -2) + (otherwise 0)))) + finally (return n))) + +(defun %format-snafu (number) + (when (zerop number) + (return-from %format-snafu nil)) + (let* ((m (mod number 5)) + (l (case m + (3 #\=) + (4 #\-) + (otherwise (code-char (+ m 48))))) + (r (cond + ((or (= m 0)) + (%format-snafu (/ number 5))) + ((or (= m 1) (= m 2)) + (%format-snafu (floor number 5))) + ((or (= m 3) (= m 4)) + (%format-snafu (floor (+ number 2) 5)))))) + (cons l r))) + +(defun format-snafu (number) + (coerce (reverse (%format-snafu number)) 'string)) + +(defun task1 (inputs) + (format-snafu + (loop for input in inputs + sum (parse-snafu input)))) + +(define-day 25 + () + #'task1 + nil) diff --git a/t/day25.lisp b/t/day25.lisp @@ -0,0 +1,22 @@ +(in-package #:adventofcode2022/test) + +(define-constant +testdata-day25+ "1=-0-2 +12111 +2=0= +21 +2=01 +111 +20012 +112 +1=-1= +1-12 +12 +1= +122" + :test 'equal) + +(def-test day25-task1 () + (is-true + (equal "2=-1=0" + (run-task 25 1 + (make-string-input-stream +testdata-day25+)))))