Code Fun: Generate Cartesian Product
xtodo
- Tuples[ list, n] return all possible n-tuples.
- Try to write this in python.
- https://x.com/xah_lee/status/1933214075229786254
Solution by moe, in python
from itertools import product lst = [1, 2, 3] k = 2 tuples = list(product(lst, repeat=k)) print(tuples) # [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
Solution by steve, in emacs lisp
(defun tuples (list n) "Returns all possible n-tuple." (if (zerop n) (list nil) (mapcan (lambda (elt) (mapcar (lambda (sub) (cons elt sub)) (tuples list (1- n)))) list))) (tuples '() 99) ; => NIL (tuples '(a b c) 0) ; => (NIL) (tuples '(a b c) 1) ; => ((A) (B) (C)) (tuples '(a b c) 2) ; => ((A A) (A B) (A C) (B A) (B B) (B C) (C A) (C B) (C C)) (tuples '(a b c) 3) ; => ((A A A) (A A B) (A A C) (A B A) (A B B) (A B C) (A C A) (A C B) (A C C) ; (B A A) (B A B) (B A C) (B B A) (B B B) (B B C) (B C A) (B C B) (B C C) ; (C A A) (C A B) (C A C) (C B A) (C B B) (C B C) (C C A) (C C B) (C C C)) (tuples '(a b) 4) ; => ((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)) ;; EDGE CASE: How should we handle it? Should it be NIL or (NIL)? (tuples '() 0) ; => (NIL)