2012-04-24 18 views
16

मेरे पास एक सूची वाली एक फ़ाइल है, और एक फ़ाइल बनाने की आवश्यकता है जो प्रत्येक पंक्ति को दूसरे से तुलना करती है।पर्ल में, मैं सूची के सभी संभावित संयोजन कैसे उत्पन्न कर सकता हूं?

AAA 
BBB 
CCC 
DDD 
EEE

मैं इस तरह देखने के लिए अंतिम सूची चाहते हैं:

AAA BBB 
AAA CCC 
AAA DDD 
AAA EEE 
BBB CCC 
BBB DDD 
BBB EEE 
CCC DDD 
CCC EEE 
DDD EEE

मैं यह पहली बार के लिए, पर्ल में यह करने के लिए कोशिश कर रहा हूँ और एक चल रहा है उदाहरण के लिए, मेरी फाइल इस है छोटी परेशानी मुझे पता है कि आपको एक सरणी बनाने की जरूरत है, और फिर इसे विभाजित करें, लेकिन इसके बाद मुझे कुछ परेशानी हो रही है।

+0

अपने अब तक कोड पोस्ट करें। – tuxuday

उत्तर

0
  1. अगले स्थिति से सरणी पर पहली स्ट्रिंग ले
  2. पुनरावृति को समाप्त करने के
    1. मूल स्ट्रिंग
  3. अगले स्ट्रिंग लेने के लिए और वापस जाने के लिए अगले स्ट्रिंग संलग्न चरण 2 पर
7

Math::Combinatorics पर एक नज़र डालें - सूचियों पर संयोजन और क्रमपरिवर्तन करें

उदाहरण CPAN से कॉपी करने:

use Math::Combinatorics; 

    my @n = qw(a b c); 
    my $combinat = Math::Combinatorics->new(count => 2, 
              data => [@n], 
             ); 

    print "combinations of 2 from: ".join(" ",@n)."\n"; 
    print "------------------------".("--" x scalar(@n))."\n"; 
    while(my @combo = $combinat->next_combination){ 
    print join(' ', @combo)."\n"; 
    } 

    print "\n"; 

    print "permutations of 3 from: ".join(" ",@n)."\n"; 
    print "------------------------".("--" x scalar(@n))."\n"; 
    while(my @permu = $combinat->next_permutation){ 
    print join(' ', @permu)."\n"; 
    } 

    output: 
combinations of 2 from: a b c 
    ------------------------------ 
    a b 
    a c 
    b c 

    permutations of 3 from: a b c 
    ------------------------------ 
    a b c 
    a c b 
    b a c 
    b c a 
    c a b 
    c b a 
+3

आप प्रश्न से उदाहरण डेटा का उपयोग क्यों नहीं करते? – daxim

+1

@ डेक्सिम: ओपी के लिए कुछ काम छोड़ना था। –

0

कैसे के बारे में:

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dump qw(dump); 

my @in = qw(AAA BBB CCC DDD EEE); 
my @list; 
while(my $first = shift @in) { 
    last unless @in; 
    my $rest = join',',@in; 
    push @list, glob("{$first}{$rest}"); 
} 
dump @list; 

उत्पादन:

(
    "AAABBB", 
    "AAACCC", 
    "AAADDD", 
    "AAAEEE", 
    "BBBCCC", 
    "BBBDDD", 
    "BBBEEE", 
    "CCCDDD", 
    "CCCEEE", 
    "DDDEEE", 
) 
+5

ग्लोब चाल हमेशा विफल होने पर विभिन्न चेतावनियों के साथ रहनी चाहिए। – daxim

+1

@daxim: क्या आपका मतलब वर्तमान कार्यशील निर्देशिका में मिलान करने वाली फ़ाइलों का "दुष्प्रभाव" है? यदि हां, तो क्या यह पूरी तरह से सुरक्षित नहीं है क्योंकि वह '?', '[]' या '*' का उपयोग नहीं कर रहा है? – flesk

+1

वह सब। मैं अब नाराज हूं, चेतावनी को उत्तर के हिस्से के रूप में स्पष्ट रूप से बाहर रखा जाना चाहिए, कम दृश्यता वाले टिप्पणी के रूप में संलग्न राजनीतिक प्रश्न नहीं। यह "दुष्प्रभाव" नहीं है, यह वास्तव में होता है, शब्द को संशोधित करना गलत है। यह सुरक्षित नहीं है: जाहिर है कि उपयोगकर्ता ने प्रश्न में मेड-अप/अनामित डेटा प्रदान किया है और वास्तविक दुनिया की स्थितियों के तहत एक बुरे आश्चर्य के लिए होगा। SO उत्तरों को लोगों को विफलता के लिए सेट अप करने का प्रयास नहीं करना चाहिए, उन्हें हमेशा सूक्ष्मता और जोखिमों के बारे में पता होना चाहिए; यह देखते हुए, मैंने अब एम 42 को इसे सुधारने के लिए प्रोत्साहन देने के लिए इस जवाब को कम कर दिया है। - जारी रखा: – daxim

28

उपयोग Algorithm::Combinatorics। इटेटरेटर आधारित दृष्टिकोण एक साथ सब कुछ उत्पन्न करने के लिए बेहतर है।

#!/usr/bin/env perl 

use strict; use warnings; 
use Algorithm::Combinatorics qw(combinations); 

my $strings = [qw(AAA BBB CCC DDD EEE)]; 

my $iter = combinations($strings, 2); 

while (my $c = $iter->next) { 
    print "@$c\n"; 
} 

आउटपुट:

AAA BBB 
AAA CCC 
AAA DDD 
AAA EEE 
BBB CCC 
BBB DDD 
BBB EEE 
CCC DDD 
CCC EEE 
DDD EEE
0

यहाँ एक हैक glob उपयोग कर रहा है:

my @list = qw(AAA BBB CCC DDD EEE); 

for my $i (0..$#list-1) { 
    print join "\n", glob sprintf "{'$list[$i] '}{%s}", 
      join ",", @list[$i+1..$#list]; 
    print "\n"; 
} 

उत्पादन:

AAA BBB 
AAA CCC 
AAA DDD 
AAA EEE 
BBB CCC 
BBB DDD 
BBB EEE 
CCC DDD 
CCC EEE 
DDD EEE 

पी.एस. वर्तमान कार्य निर्देशिका में मेल खाने वाली फाइलों की चेतावनी से बचने के लिए आप सादे glob() के बजाय Text::Glob::Expand या String::Glob::Permute मॉड्यूल का उपयोग करना चाह सकते हैं।

+4

ग्लोब चाल हमेशा विफल होने पर विभिन्न चेतावनियों के साथ रहनी चाहिए। – daxim

8

रिकर्सन का उपयोग करके इसे लिखना सरल है।

यह कोड उदाहरण दर्शाता है।

use strict; 
use warnings; 

my $strings = [qw(AAA BBB CCC DDD EEE)]; 

sub combine; 

print "@$_\n" for combine $strings, 5; 

sub combine { 

    my ($list, $n) = @_; 
    die "Insufficient list members" if $n > @$list; 

    return map [$_], @$list if $n <= 1; 

    my @comb; 

    for my $i (0 .. $#$list) { 
    my @rest = @$list; 
    my $val = splice @rest, $i, 1; 
    push @comb, [$val, @$_] for combine \@rest, $n-1; 
    } 

    return @comb; 
} 

संपादित

मेरे क्षमायाचना - मैं संयोजन के बजाय क्रमपरिवर्तन पैदा किया गया था।

यह कोड सही है।

use strict; 
use warnings; 

my $strings = [qw(AAA BBB CCC DDD EEE)]; 

sub combine; 

print "@$_\n" for combine $strings, 2; 

sub combine { 

    my ($list, $n) = @_; 
    die "Insufficient list members" if $n > @$list; 

    return map [$_], @$list if $n <= 1; 

    my @comb; 

    for (my $i = 0; $i+$n <= @$list; ++$i) { 
    my $val = $list->[$i]; 
    my @rest = @$list[$i+1..$#$list]; 
    push @comb, [$val, @$_] for combine \@rest, $n-1; 
    } 

    return @comb; 
} 

उत्पादन

AAA BBB 
AAA CCC 
AAA DDD 
AAA EEE 
BBB CCC 
BBB DDD 
BBB EEE 
CCC DDD 
CCC EEE 
DDD EEE 
संबंधित मुद्दे

 संबंधित मुद्दे