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 #
# returns the Cartesian product of a and b #
# Cartesian product operators #
PRIO X = 7; # same as * #
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 #
OP X = ( [][]INT a )[,]INT:
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 lxlxl = ( []INT a, b, c )VOID:
BEGIN
PROC print xll = ( [][]INT a )VOID:
print list( a );print( ( "X" ) );print list( b );print( ( "X" ) );
IF LWB a < UPB a THEN
print list( c );print( ( "=" ) );print product( a X b X c );
# non empty list of lists #
print( ( newline ) )
print list( a[ LWB a ] );
END # print lxlxl # ;
FOR i FROM LWB a + 1 TO UPB a DO
PROC print lxlxlxl = ( []INT a, b, c, d )VOID:
print( ( "X" ) );print list( a[ i ] )
BEGIN
OD;
print list( a );print( ( "X" ) );print list( b );print( ( "X" ) );
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 ) )
END # print lxlxlxl # ;
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 lxlxlxl( ( 1776, 1789 ), ( 7, 12 ), ( 4, 14, 23 ), ( 0, 1 ) );
print xll( ( ( 1776, 1789 ), ( 7, 12 ), ( 4, 14, 23 ), ( 0, 1 ) ) );
print lxlxl( ( 1, 2, 3 ), ( 30 ), ( 500, 100 ) );
print xll( ( ( 1, 2, 3 ), ( 30 ), ( 500, 100 ) ) );
print lxlxl( ( 1, 2, 3 ), (), ( 500, 100 ) )
print xll( ( ( 1, 2, 3 ), (), ( 500, 100 ) ) )
END
END
END
END