--- /dev/null
+;;;; adventofcode2020.asd
+
+(asdf:defsystem #:adventofcode2020
+ :description "Advent of Code 2020"
+ :author "Jack Kinsey <journcy@gmail.com>"
+ :version "0.0.1"
+ :serial t
+ :depends-on (:alexandria
+ :arrow-macros
+ :fiveam)
+ :pathname "src/"
+ :components ((:file "package")
+ (:file "adventofcode2020"))
+ :in-order-to ((test-op (test-op :adventofcode2020/test))))
+
+(asdf:defsystem #:adventofcode2020/tests
+ :description "Advent of Code 2020 test suite"
+ :author "Jack Kinsey <journcy@gmail.com>"
+ :depends-on (:adventofcode2020 :fiveam)
+ :pathname "t/"
+ :components ((:file "package")
+ (:file "adventofcode2020"))
+ :perform (test-op (o c) (symbol-call :5am :run! :adventofcode2020)))
--- /dev/null
+(defpackage #:adventofcode2020
+ (:use #:cl
+ #:arrow-macros
+ #:alexandria
+ #:fiveam)
+ (:import-from :cl-ppcre :split)
+ (:nicknames :aoc2020))
--- /dev/null
+(in-package #:adventofcode2020)
+
+(defmacro day (num var &body body)
+ (let ((day-str (format nil "day~2,'0D" num)))
+ `(let ((,var (alexandria:read-file-into-string ,(format nil "./res/~A" day-str))))
+ ,@body)))
+
+(defun part1 (str)
+ (format t "Part 1: ~A~%" str))
+
+(defun part2 (str)
+ (format t "Part 2: ~A~%" str))
+
--- /dev/null
+(in-package #:adventofcode2020)
+
+(defun simple-fuel (mass)
+ (- (floor (/ mass 3))
+ 2))
+
+(defun complex-fuel (mass)
+ (loop with m = (simple-fuel mass)
+ while (> m 0) sum m
+ do (setf m (simple-fuel m))))
+
+(day 00 input
+ (let ((modules (int-list-from input)))
+ (part1 (reduce #'+ (mapcar #'simple-fuel modules)))
+ (part2 (reduce #'+ (mapcar #'complex-fuel modules)))))
+
+(def-suite day00)
+(in-suite day00)
+
+(test simple-fuel
+ (is (equal
+ '(2 2 654 33583)
+ (mapcar #'simple-fuel '(12 14 1969 100756)))))
+
+(test complex-fuel
+ (is (equal
+ '(2 966 50346)
+ (mapcar #'complex-fuel '(14 1969 100756)))))
+
+(run! 'day00)
--- /dev/null
+(in-package #:adventofcode2020)
+
+;;; Utility functions
+
+(defun list-from (str)
+ (split "\\n" str))
+
+(defun int-list-from (str)
+ (mapcar #'parse-integer (split "\\n" str)))
--- /dev/null
+;;;; adventofcode2020.lisp
+
+(in-package #:adventofcode2020)
--- /dev/null
+(in-package #:adventofcode2020)
+