从给定的字符串中获取所有可能的条件配对(不更改顺序且不反向复制)

时间:2013-07-03 15:41:04

标签: perl

请为所有可能的示例提供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
    

2 个答案:

答案 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)