commit fbb2c33462d6611b8801e9a3f28d8012f545f9c2
parent 90579a511a64f2a6c89db48afc90203ec110d028
Author: Lukas Henkel <lh@entf.net>
Date: Sun, 25 Dec 2022 12:56:19 +0100
Day 25
Diffstat:
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+)))))