Add day 01
[adventofcode2020.git] / src / utilities.lisp
index c677e964c2cda5fd874d39b7c06b09586a0013c7..ab6c3e8faa36eb6d59ac780c1ae7d8f6670a142b 100644 (file)
@@ -7,3 +7,34 @@
 
 (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)))))
+
+