请为所有可能的示例提供perl代码。
输入:
M1-M1-F2
输出:
M1-F2
输入:
F1-F2-F1-M1
输出:
F1-M1
F2-M1
输入:
F3-F4-M1-F5
输出:
F3-M1
F4-M1
M1-F5
输入:
F3-F4-M4-F5-M7
输出:
F3-M4
F3-M7
F4-M4
F4-M7
M4-F5
F5-M7
答案 0 :(得分:0)
我不确定原始订单是否可以使用笛卡尔积保留,但之前我错了: - )
即使保留了原始订单,我也看不出男女的要求是如何实现的。
这是一个保留原始订单的解决方案。
#!/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";
}
答案 1 :(得分:-1)