September 15, 2018
Just Juxt #32: Cartesian Product (4clojure #90)
Write a function which calculates the Cartesian product of two sets.
(ns live.test
(:require [cljs.test :refer-macros [deftest is testing run-tests]]))
(defn cartesian [x y]
(into #{} (mapcat #(map (juxt (constantly %) identity) y)) x))
(deftest cartesian-test
(is (= (cartesian #{"ace" "king" "queen"} #{"♠" "♥" "♦" "♣"})
#{["ace" "♠"] ["ace" "♥"] ["ace" "♦"] ["ace" "♣"]
["king" "♠"] ["king" "♥"] ["king" "♦"] ["king" "♣"]
["queen" "♠"] ["queen" "♥"] ["queen" "♦"] ["queen" "♣"]}))
(is (= (cartesian #{1 2 3} #{4 5})
#{[1 4] [2 4] [3 4] [1 5] [2 5] [3 5]}))
(is (= 300 (count (cartesian (into #{} (range 10))
(into #{} (range 30)))))))
(run-tests)