How to resolve the algorithm Cartesian product of two or more lists step by step in the Perl programming language
Published on 12 May 2024 09:40 PM
How to resolve the algorithm Cartesian product of two or more lists step by step in the Perl programming language
Table of Contents
Problem Statement
Show one or more idiomatic ways of generating the Cartesian product of two arbitrary lists in your language. Demonstrate that your function/method correctly returns: and, in contrast: Also demonstrate, using your function/method, that the product of an empty list with any other list is empty. For extra credit, show or write a function returning the n-ary product of an arbitrary number of lists, each of arbitrary length. Your function might, for example, accept a single argument which is itself a list of lists, and return the n-ary product of those lists. Use your n-ary Cartesian product function to show the following products:
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Cartesian product of two or more lists step by step in the Perl programming language
Source code in the perl programming language
sub cartesian {
my $sets = shift @_;
for (@$sets) { return [] unless @$_ }
my $products = [[]];
for my $set (reverse @$sets) {
my $partial = $products;
$products = [];
for my $item (@$set) {
for my $product (@$partial) {
push @$products, [$item, @$product];
}
}
}
$products;
}
sub product {
my($s,$fmt) = @_;
my $tuples;
for $a ( @{ cartesian( \@$s ) } ) { $tuples .= sprintf "($fmt) ", @$a; }
$tuples . "\n";
}
print
product([[1, 2], [3, 4] ], '%1d %1d' ).
product([[3, 4], [1, 2] ], '%1d %1d' ).
product([[1, 2], [] ], '%1d %1d' ).
product([[], [1, 2] ], '%1d %1d' ).
product([[1,2,3], [30], [500,100] ], '%1d %1d %3d' ).
product([[1,2,3], [], [500,100] ], '%1d %1d %3d' ).
product([[1776,1789], [7,12], [4,14,23], [0,1]], '%4d %2d %2d %1d')
$tuples = [ map { [split /:/] } glob '{1,2,3}:{30}:{500,100}' ];
for $a (@$tuples) { printf "(%1d %2d %3d) ", @$a; }
use ntheory qw/forsetproduct/;
forsetproduct { say "@_" } [1,2,3],[qw/a b c/],[qw/@ $ !/];
use Set::Product qw/product/;
product { say "@_" } [1,2,3],[qw/a b c/],[qw/@ $ !/];
use Math::Cartesian::Product;
cartesian { say "@_" } [1,2,3],[qw/a b c/],[qw/@ $ !/];
use Algorithm::Loops qw/NestedLoops/;
NestedLoops([[1,2,3],[qw/a b c/],[qw/@ $ !/]], sub { say "@_"; });
You may also check:How to resolve the algorithm Gotchas step by step in the Wren programming language
You may also check:How to resolve the algorithm Sorting algorithms/Gnome sort step by step in the Phix programming language
You may also check:How to resolve the algorithm Function definition step by step in the Java programming language
You may also check:How to resolve the algorithm Hailstone sequence step by step in the ARM Assembly programming language
You may also check:How to resolve the algorithm Binary digits step by step in the Retro programming language