Cartesian product of two or more lists: Difference between revisions
Content added Content deleted
(Added Algol 68) |
(→{{header|ALGOL 68}}: Added a unary X operator to calculate the product of a list of lists) |
||
Line 282: | Line 282: | ||
{}</pre> |
{}</pre> |
||
=={{header|ALGOL 68}}== |
=={{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. |
Using a 1-dimensional array of INT to represent a list and a 2-dimensional array ( [,]INT ) to represent a product of two (or more) lists. |
||
<br> |
|||
A list of lists is represented by a 1-dimensional array of 1-dimensional arrays of INT ([][]INT). |
|||
<syntaxhighlight lang="algol68"> |
<syntaxhighlight lang="algol68"> |
||
BEGIN # Cartesian Product # |
BEGIN # Cartesian Product # |
||
# |
# Cartesian product operators # |
||
PRIO X = 7; # |
PRIO X = 7; # give X he same priority as * # |
||
# returns the Cartesian product of the lists a and b # |
|||
OP X = ( []INT a, b )[,]INT: |
OP X = ( []INT a, b )[,]INT: |
||
BEGIN |
BEGIN |
||
Line 303: | Line 306: | ||
result |
result |
||
END # X # ; |
END # X # ; |
||
# returns the Cartesian product of the Cartesian product a and list b # |
|||
OP X = ( [,]INT a, []INT b )[,]INT: |
OP X = ( [,]INT a, []INT b )[,]INT: |
||
BEGIN |
BEGIN |
||
Line 319: | Line 323: | ||
result |
result |
||
END # X # ; |
END # X # ; |
||
# returns the Cartesian product of the lists in a # |
|||
⚫ | |||
IF UPB a <= LWB a |
|||
THEN # zero or 1 list # |
|||
[,]INT() |
|||
ELSE # 2 or more lists # |
|||
FLEX[ 1 : 0, 1 : 0 ]INT result := a[ LWB a ] X a[ LWB a + 1 ]; |
|||
FOR i FROM LWB a + 2 TO UPB a DO |
|||
result := result X a[ i ] |
|||
OD; |
|||
result |
|||
FI # X # ; |
|||
# print a Cartesian product # |
# print a Cartesian product # |
||
PROC print product = ( [,]INT p )VOID: |
PROC print product = ( [,]INT p )VOID: |
||
Line 347: | Line 363: | ||
print( ( "]" ) ) |
print( ( "]" ) ) |
||
END # print list # ; |
END # print list # ; |
||
# test the X operators |
BEGIN # test the X operators # |
||
# prints the product of two lists # |
|||
BEGIN |
|||
PROC print lxl = ( []INT a, b )VOID: |
PROC print lxl = ( []INT a, b )VOID: |
||
BEGIN |
BEGIN |
||
Line 355: | Line 371: | ||
print( ( newline ) ) |
print( ( newline ) ) |
||
END # print lxl # ; |
END # print lxl # ; |
||
# prints the product of a list of lists # |
|||
⚫ | |||
PROC print xll = ( [][]INT a )VOID: |
|||
IF LWB a < UPB a THEN |
|||
# non empty list of lists # |
|||
print |
print list( a[ LWB a ] ); |
||
FOR i FROM LWB a + 1 TO UPB a DO |
|||
print( ( "X" ) );print list( a[ i ] ) |
|||
OD; |
|||
print( ( "=" ) );print product( X a ); |
|||
print list( c );print( ( "X" ) );print list( d ); |
|||
print( ( "=" ) );print product( a X b X c X d ); |
|||
print( ( newline ) ) |
print( ( newline ) ) |
||
FI # print xll # ; |
|||
print lxl( ( 1, 2 ), ( 3, 4 ) ); |
print lxl( ( 1, 2 ), ( 3, 4 ) ); |
||
print lxl( ( 3, 4 ), ( 1, 2 ) ); |
print lxl( ( 3, 4 ), ( 1, 2 ) ); |
||
print lxl( ( 1, 2 ), () ); |
print lxl( ( 1, 2 ), () ); |
||
print lxl( (), ( 1, 2 ) ); |
print lxl( (), ( 1, 2 ) ); |
||
print |
print xll( ( ( 1776, 1789 ), ( 7, 12 ), ( 4, 14, 23 ), ( 0, 1 ) ) ); |
||
print |
print xll( ( ( 1, 2, 3 ), ( 30 ), ( 500, 100 ) ) ); |
||
print |
print xll( ( ( 1, 2, 3 ), (), ( 500, 100 ) ) ) |
||
END |
END |
||
END |
END |