+; (ql:quickload :fiveam) (ql:quickload :cl-ppcre)
(defpackage #:adventofcode2020
(:use #:cl
#:arrow-macros
,@body)))
(defun part1 (str)
- (format t "Part 1: ~A~%" str))
+ (time (format t "Part 1: ~A~%" str)))
(defun part2 (str)
- (format t "Part 2: ~A~%" str))
+ (time (format t "Part 2: ~A~%" str)))
--- /dev/null
+(in-package #:adventofcode2020)
+
+(defun calculate-expenses (&rest reports)
+ (let ((prod (apply #'cartesian-product reports)))
+ (loop for tuple in prod
+ when (= (apply #'+ tuple) 2020)
+ return (apply #'* tuple))))
+
+(day 01 input
+ (let ((report (int-list-from input)))
+ (part1 (calculate-expenses report report))
+ (part2 (calculate-expenses report report report))))
+
+(def-suite day01)
+(in-suite day01)
+
+(test simple-expenses
+ (is (equal
+ 514579
+ (let ((report '(1721 979 366 299 675 1456)))
+ (calculate-expenses report report)))))
+
+(test complex-expenses
+ (is (equal
+ 241861950
+ (let ((report '(1721 979 366 299 675 1456)))
+ (calculate-expenses report report report)))))
+
+(run! 'day01)
(defun int-list-from (str)
(mapcar #'parse-integer (split "\\n" str)))
+
+(defun cartesian-product (A B &rest C)
+ (let ((helper (lambda (X Y)
+ (if Y (loop for x in X
+ nconc (loop for y in Y
+ collecting (append x (list y))))
+ X)))
+ (wrap-A (mapcar #'list A)))
+ (reduce helper C :initial-value (funcall helper wrap-A B))))
+
+(def-suite util)
+(in-suite util)
+
+(test cart-prod-2
+ (is (equal
+ '((a a) (a b) (b a) (b b))
+ (cartesian-product '(a b) '(a b)))))
+
+(test cart-prod-3
+ (is (equal
+ '((a a a) (a a b) (a b a) (a b b)
+ (b a a) (b a b) (b b a) (b b b))
+ (cartesian-product '(a b) '(a b) '(a b)))))
+
+(test cart-prod-4
+ (is (equal
+ '((a a a a) (a a a b) (a a b a) (a a b b) (a b a a) (a b a b) (a b b a) (a b b b)
+ (b a a a) (b a a b) (b a b a) (b a b b) (b b a a) (b b a b) (b b b a) (b b b b))
+ (cartesian-product '(a b) '(a b) '(a b) '(a b)))))
+
+