Cartesian product of two or more lists: Difference between revisions

Content added Content deleted
No edit summary
Line 2,917: Line 2,917:


=={{header|Rust}}==
=={{header|Rust}}==
<lang rust>type List = Vec<Vec<u32>>;
<lang rust>fn cartesian_product(lists: &Vec<Vec<u32>>) -> Vec<Vec<u32>> {
let mut res = vec![];

fn cartesian_product(lists: &List) -> List {
let mut res: List = vec![];
if lists.len() < 2 || lists.iter().any(|x| x.len() == 0) {
return res
}


let mut list_iter = lists.iter();
let mut list_iter = lists.iter();
Line 2,932: Line 2,927:
}
}
for l in list_iter {
for l in list_iter {
let mut tmp: List = List::new();
let mut tmp = vec![];
for r in res {
for r in res {
for &el in l {
for &el in l {
Line 2,944: Line 2,939:
res
res
}
}

fn print_list(list: &List) {
fn main() {
let cases = vec![
print!("{{ ");
vec![vec![1, 2], vec![3, 4]],
for inner_list in list {
print!("( ");
vec![vec![3, 4], vec![1, 2]],
for el in inner_list {
vec![vec![1, 2], vec![]],
print!("{} ", el);
vec![vec![], vec![1, 2]],
vec![vec![1776, 1789], vec![7, 12], vec![4, 14, 23], vec![0, 1]],
}
vec![vec![1, 2, 3], vec![30], vec![500, 100]],
print!(") ");
vec![vec![1, 2, 3], vec![], vec![500, 100]],
];
for case in cases {
println!(
"{}\n{:?}\n",
case.iter().map(|c| format!("{:?}", c)).collect::<Vec<_>>().join(" × "),
cartesian_product(&case)
)
}
}
println!("}}");
}

fn main() {
println!("{{1, 2}} x {{3, 4}}");
print_list(&cartesian_product(&vec![vec![1, 2], vec![3, 4]]));
println!("\n{{3, 4}} x {{1, 2}}");
print_list(&cartesian_product(&vec![vec![3, 4], vec![1, 2]]));
println!("\n{{1, 2}} x {{}}");
print_list(&cartesian_product(&vec![vec![1, 2], vec![]]));
println!("\n{{}} x {{1, 2}}");
print_list(&cartesian_product(&vec![vec![], vec![1, 2]]));
println!("\n{{1776, 1789}} × {{7, 12}} × {{4, 14, 23}} × {{0, 1}}");
print_list(&cartesian_product(&vec![vec![1776, 1789], vec![7, 12], vec![4, 14, 23], vec![0, 1]]));
println!("\n{{1, 2, 3}} × {{30}} × {{500, 100}}");
print_list(&cartesian_product(&vec![vec![1, 2, 3], vec![30], vec![500, 100]]));
println!("\n{{1, 2, 3}} × {{}} × {{500, 100}}");
print_list(&cartesian_product(&vec![vec![1, 2, 3], vec![], vec![500, 100]]));
}
}
</lang>
</lang>
{{out}}<pre>{1, 2} x {3, 4}
{{out}}<pre>[1, 2] × [3, 4]
{ ( 1 3 ) ( 1 4 ) ( 2 3 ) ( 2 4 ) }
[[1, 3], [1, 4], [2, 3], [2, 4]]


{3, 4} x {1, 2}
[3, 4] × [1, 2]
{ ( 3 1 ) ( 3 2 ) ( 4 1 ) ( 4 2 ) }
[[3, 1], [3, 2], [4, 1], [4, 2]]


{1, 2} x {}
[1, 2] × []
[]
{ }


{} x {1, 2}
[] × [1, 2]
[]
{ }


{1776, 1789} × {7, 12} × {4, 14, 23} × {0, 1}
[1776, 1789] × [7, 12] × [4, 14, 23] × [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 ) }
[[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} × {30} × {500, 100}
[1, 2, 3] × [30] × [500, 100]
{ ( 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]]


{1, 2, 3} × {} × {500, 100}
[1, 2, 3] × [] × [500, 100]
[]
{ }
</pre>
</pre>