Cartesian product of two or more lists: Difference between revisions
Content added Content deleted
m (→Using the 'Applicative' abstraction: (Minor edit in preamble - foreground link to Applicative Functor wiki page)) |
(→{{header|Groovy}}: Initial solution) |
||
Line 842: | Line 842: | ||
return |
return |
||
}</lang> |
}</lang> |
||
=={{header|Groovy}}== |
|||
'''Solution:''' |
|||
<lang groovy>def cartProd(Iterable ... lists) { |
|||
assert lists |
|||
def order = lists.size() |
|||
assert order > 1 |
|||
def dims = lists*.size() |
|||
if (order == 2) { |
|||
def (n0,n1) = dims |
|||
(0..<(n0*n1)).inject([]) { prod, i -> prod << [lists[0][i.intdiv(n1)],lists[1][i%n1]] } |
|||
} else { |
|||
def (l1,l2) = lists[0..1] |
|||
Iterable[] newLists = [cartProd(l1,l2)] + lists[2..<order] |
|||
cartProd(newLists).collect { it.flatten() } |
|||
} |
|||
}</lang> |
|||
'''Test:''' |
|||
<lang groovy>println "[1, 2] × [3, 4] = ${cartProd([1, 2], [3, 4])}" |
|||
println "[3, 4] × [1, 2] = ${cartProd([3, 4], [1, 2])}" |
|||
println "[1, 2] × [] = ${cartProd([1, 2], [])}" |
|||
println "[] × [1, 2] = ${cartProd([], [1, 2])}" |
|||
println "[1776, 1789] × [7, 12] × [4, 14, 23] × [0, 1] = ${cartProd([1776, 1789], [7, 12], [4, 14, 23], [0, 1])}" |
|||
println "[1, 2, 3] × [30] × [500, 100] = ${cartProd([1, 2, 3], [30], [500, 100])}" |
|||
println "[1, 2, 3] × [] × [500, 100] = ${cartProd([1, 2, 3], [], [500, 100])}" |
|||
println "[John,Paul,George,Ringo] × [Emerson,Lake,Palmer] × [Simon,Garfunkle] = [" |
|||
cartProd(["John","Paul","George","Ringo"], ["Emerson","Lake","Palmer"], ["Simon","Garfunkle"]).each { println "\t${it}," } |
|||
println "]"</lang> |
|||
'''Output:''' |
|||
<pre>[1, 2] × [3, 4] = [[1, 3], [1, 4], [2, 3], [2, 4]] |
|||
[3, 4] × [1, 2] = [[3, 1], [3, 2], [4, 1], [4, 2]] |
|||
[1, 2] × [] = [] |
|||
[] × [1, 2] = [] |
|||
[1776, 1789] × [7, 12] × [4, 14, 23] × [0, 1] = [[1776, 7, 4, 0], [1776, 7, 4, 1], [1776, 7, 14, 0], [1776, 7, 14, 1], [1776, 7, 23, 0], [1776, 7, 23, 1], [1776, 12, 4, 0], [1776, 12, 4, 1], [1776, 12, 14, 0], [1776, 12, 14, 1], [1776, 12, 23, 0], [1776, 12, 23, 1], [1789, 7, 4, 0], [1789, 7, 4, 1], [1789, 7, 14, 0], [1789, 7, 14, 1], [1789, 7, 23, 0], [1789, 7, 23, 1], [1789, 12, 4, 0], [1789, 12, 4, 1], [1789, 12, 14, 0], [1789, 12, 14, 1], [1789, 12, 23, 0], [1789, 12, 23, 1]] |
|||
[1, 2, 3] × [30] × [500, 100] = [[1, 30, 500], [1, 30, 100], [2, 30, 500], [2, 30, 100], [3, 30, 500], [3, 30, 100]] |
|||
[1, 2, 3] × [] × [500, 100] = [] |
|||
[John,Paul,George,Ringo] × [Emerson,Lake,Palmer] × [Simon,Garfunkle] = [ |
|||
[John, Emerson, Simon], |
|||
[John, Emerson, Garfunkle], |
|||
[John, Lake, Simon], |
|||
[John, Lake, Garfunkle], |
|||
[John, Palmer, Simon], |
|||
[John, Palmer, Garfunkle], |
|||
[Paul, Emerson, Simon], |
|||
[Paul, Emerson, Garfunkle], |
|||
[Paul, Lake, Simon], |
|||
[Paul, Lake, Garfunkle], |
|||
[Paul, Palmer, Simon], |
|||
[Paul, Palmer, Garfunkle], |
|||
[George, Emerson, Simon], |
|||
[George, Emerson, Garfunkle], |
|||
[George, Lake, Simon], |
|||
[George, Lake, Garfunkle], |
|||
[George, Palmer, Simon], |
|||
[George, Palmer, Garfunkle], |
|||
[Ringo, Emerson, Simon], |
|||
[Ringo, Emerson, Garfunkle], |
|||
[Ringo, Lake, Simon], |
|||
[Ringo, Lake, Garfunkle], |
|||
[Ringo, Palmer, Simon], |
|||
[Ringo, Palmer, Garfunkle], |
|||
]</pre> |
|||
=={{header|Haskell}}== |
=={{header|Haskell}}== |