请我需要所有可能的示例的 perl 代码。
注释:
- M=男
- F=女性
- 男名M开头
- 女名F开头
配对条件:
- 每对必须由一名男性和一名女性组成。
- 不允许重复对(包括反向重复)。
输入示例和所需输出:
输入:
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
请我需要所有可能的示例的 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
我不确定是否可以使用笛卡尔积保留原始订单,但是我之前错了:-)
即使保留原来的顺序,我也看不到男女之间的要求是如何实现的。
这是一个保留原始顺序的解决方案。
#!/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";
}