Cartesian product of two or more lists: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) 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 --------------------------------------------------------- |