我不确定是否可以使用笛卡尔积保留原始订单,但是我之前错了:-)
即使保留原来的顺序,我也看不到男女之间的要求是如何实现的。
这是一个保留原始顺序的解决方案。
#!/usr/bin/perl
use strict;
use warnings;
while (<DATA>) {
chomp;
my %data;
my $i;
for my $key (split /-/) {
$data{$key} ||= ++$i;
}
my @ordered = sort {$data{$a} <=> $data{$b}} keys %data;
while (@ordered > 1) {
my $first = shift @ordered;
print join("\n",
map {"$first-$_"}
grep substr($first, 0,1) ne substr($_, 0,1), @ordered), "\n";
}
print "\n" unless eof;
}
__DATA__
M1-M1-F2
F1-F2-F1-M1
F3-F4-M1-F5
F3-F4-M4-F5-M7
结果是:
M1-F2
F1-M1
F2-M1
F3-M1
F4-M1
M1-F5
F3-M4
F3-M7
F4-M4
F4-M7
M4-F5
F5-M7
更新:组合解决方案。
#!/usr/bin/perl
use strict;
use warnings;
while (<DATA>) {
chomp;
my %data;
my $i;
for my $key (split /-/) {
$data{$key} ||= ++$i;
}
my @ordered = sort {$data{$a} <=> $data{$b}} keys %data;
for my $i (0 .. $#ordered) {
for my $j ($i+1 .. $#ordered) {
print "$ordered[$i]-$ordered[$j]\n"
if substr($ordered[$i], 0, 1) ne substr($ordered[$j], 0, 1);
}
}
print "\n";
}