-5

请我需要所有可能的示例的 perl 代码。

注释:

  • M=男
  • F=女性
  • 男名M开头
  • 女名F开头

配对条件:

  • 每对必须由一名男性和一名女性组成。
  • 不允许重复对(包括反向重复)。

输入示例和所需输出:

  1. 输入:

    M1-M1-F2
    

    输出:

    M1-F2
    
  2. 输入:

    F1-F2-F1-M1
    

    输出:

    F1-M1
    F2-M1
    
  3. 输入:

    F3-F4-M1-F5
    

    输出:

    F3-M1
    F4-M1
    M1-F5
    
  4. 输入:

    F3-F4-M4-F5-M7
    

    输出:

    F3-M4
    F3-M7
    F4-M4
    F4-M7
    M4-F5
    F5-M7
    
4

2 回答 2

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";
}
于 2013-07-03T22:46:30.777 回答
-1

您正在寻找的东西称为笛卡尔积。见http://lookatperl.blogspot.ca/2012/12/a-look-at-cartesian-products.html

于 2013-07-03T16:52:06.687 回答