Jump to content

Cartesian product of two or more lists: Difference between revisions

→‎{{header|Groovy}}: Initial solution
m (→‎Using the 'Applicative' abstraction: (Minor edit in preamble - foreground link to Applicative Functor wiki page))
(→‎{{header|Groovy}}: Initial solution)
Line 842:
return
}</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}}==
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.