September 15, 2018

Just Juxt #32: Cartesian Product (4clojure #90)

Cartesian Product

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)
Tags: coding exercises KLIPSE 4clojure Cryogen juxt