Cartesian product of two or more lists: Difference between revisions

Content added Content deleted
m (Automated syntax highlighting fixup (second round - minor fixes))
(Added Algol 68)
Line 281: Line 281:
{(1,30,500),(1,30,100),(2,30,500),(2,30,100),(3,30,500),(3,30,100)}
{(1,30,500),(1,30,100),(2,30,500),(2,30,100),(3,30,500),(3,30,100)}
{}</pre>
{}</pre>
=={{header|ALGOL 68}}==
Using a 1-dimensional array of INT to represent a list and a 2-dimensional array to represent a product of two (or more) lists.
<syntaxhighlight lang="algol68">
BEGIN # Cartesian Product #
# returns the Cartesian product of a and b #
PRIO X = 7; # same as * #
OP X = ( []INT a, b )[,]INT:
BEGIN
[]INT a1 = a[ AT 1 ];
[]INT b1 = b[ AT 1 ];
INT len = UPB a1 * UPB b1;
[ 1 : len, 1 : IF len > 0 THEN 2 ELSE 0 FI ]INT result;
INT pos := 0;
FOR i TO UPB a1 DO
FOR j TO UPB b1 DO
pos +:= 1;
result[ pos, 1 ] := a1[ i ];
result[ pos, 2 ] := b1[ j ]
OD
OD;
result
END # X # ;
OP X = ( [,]INT a, []INT b )[,]INT:
BEGIN
[,]INT a1 = a[ AT 1, AT 1 ];
[]INT b1 = b[ AT 1 ];
INT len = 1 UPB a1 * UPB b1;
INT width = IF len <= 0 THEN 0 ELSE 2 UPB a1 + 1 FI;
[ 1 : len, 1 : width ]INT result;
INT pos := 0;
FOR i TO 1 UPB a1 DO
FOR j TO UPB b1 DO
result[ pos +:= 1, 1 : width - 1 ] := a1[ i, : ];
result[ pos, width ] := b1[ j ]
OD
OD;
result
END # X # ;
# print a Cartesian product #
PROC print product = ( [,]INT p )VOID:
BEGIN
print( ( "[" ) );
STRING close := "]";
STRING open := "(";
FOR i FROM 1 LWB p TO 1 UPB p DO
STRING separator := open;
FOR j FROM 2 LWB p TO 2 UPB p DO
print( ( separator, whole( p[ i, j ], 0 ) ) );
separator := ","
OD;
open := "),(";
close := ")]"
OD;
print( ( close ) )
END # print product # ;
# print a list #
PROC print list = ( []INT t )VOID:
BEGIN
print( ( "[" ) );
STRING separator := "";
FOR i FROM LWB t TO UPB t DO
print( ( separator, whole( t[ i ], 0 ) ) );
separator := ","
OD;
print( ( "]" ) )
END # print list # ;
# test the X operators #
BEGIN
PROC print lxl = ( []INT a, b )VOID:
BEGIN
print list( a );print( ( "X" ) );print list( b );
print( ( "=" ) );print product( a X b );
print( ( newline ) )
END # print lxl # ;
PROC print lxlxl = ( []INT a, b, c )VOID:
BEGIN
print list( a );print( ( "X" ) );print list( b );print( ( "X" ) );
print list( c );print( ( "=" ) );print product( a X b X c );
print( ( newline ) )
END # print lxlxl # ;
PROC print lxlxlxl = ( []INT a, b, c, d )VOID:
BEGIN
print list( a );print( ( "X" ) );print list( b );print( ( "X" ) );
print list( c );print( ( "X" ) );print list( d );
print( ( "=" ) );print product( a X b X c X d );
print( ( newline ) )
END # print lxlxlxl # ;
print lxl( ( 1, 2 ), ( 3, 4 ) );
print lxl( ( 3, 4 ), ( 1, 2 ) );
print lxl( ( 1, 2 ), () );
print lxl( (), ( 1, 2 ) );
print lxlxlxl( ( 1776, 1789 ), ( 7, 12 ), ( 4, 14, 23 ), ( 0, 1 ) );
print lxlxl( ( 1, 2, 3 ), ( 30 ), ( 500, 100 ) );
print lxlxl( ( 1, 2, 3 ), (), ( 500, 100 ) )
END
END
</syntaxhighlight>
{{out}}
<pre>
[1,2]X[3,4]=[(1,3),(1,4),(2,3),(2,4)]
[3,4]X[1,2]=[(3,1),(3,2),(4,1),(4,2)]
[1,2]X[]=[]
[]X[1,2]=[]
[1776,1789]X[7,12]X[4,14,23]X[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]X[30]X[500,100]=[(1,30,500),(1,30,100),(2,30,500),(2,30,100),(3,30,500),(3,30,100)]
[1,2,3]X[]X[500,100]=[]
</pre>

=={{header|APL}}==
=={{header|APL}}==


Line 347: Line 455:
↑nary_cart(1 2 3)(⍬)(50 100) ⍝ empty output
↑nary_cart(1 2 3)(⍬)(50 100) ⍝ empty output
</pre>
</pre>

=={{header|AppleScript}}==
=={{header|AppleScript}}==
<syntaxhighlight lang="applescript">-- CARTESIAN PRODUCTS ---------------------------------------------------------
<syntaxhighlight lang="applescript">-- CARTESIAN PRODUCTS ---------------------------------------------------------