2011-08-30 5 views
2

J'ai été mis au défi avec un problème de mathématiques. Étant donné dix nombres (dans ce cas, des nombres de 1 à 10), combien y a-t-il de combinaisons uniques de six nombres? La réponse courte est 210. Cependant, j'aimerais savoir quelles sont ces combinaisons.imprimer des lignes uniques en Perl

J'ai mis le code suivant ensemble. La première boucle fonctionne bien pour créer beaucoup de combinaisons triées, mais je n'ai pas pu imprimer uniquement les combinaisons de lignes uniques. Comment puis-je imprimer ces lignes uniques?

my %hash; 
my @sorted_numbers; 

# make all permutations with numbers from 1 to 10 
my $permutor = List::Permutor->new (1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
while (my @permutation = $permutor->next()) { 
     my $string = "@permutation"; 
     my ($N1, $N2, $N3, $N4, $N5, $N6, $N7, $N8, $N9, $N10) = split (/ /, $string); 

     # chose only the first six numbers and sort them in ascending order 
     my @numbers = ($N1, $N2, $N3, $N4, $N5, $N6); 
     @sorted_numbers = sort {$a <=> $b} @numbers; 
} 

# print out the unique number combinations from the temp file 
my @unique_combinations = uniq @sorted_numbers; 
foreach (@unique_combinations) { 
    print $_, "\n"; 
} 
+2

Vous ne devez d'abord tour '@ permutation' dans une chaîne, puis le partage encore. Utilisez simplement '@numbers = @permutation [0..5]'. Et il semble un peu étrange de trier les chiffres ... le but de cet exercice n'est-il pas de trouver les différentes permutations? – TLP

+0

combinaisons uniques en fait. J'ai juste des façons bizarres de faire les choses: S mais j'apprends;) – Steve

+0

Aussi, utiliser un hash est souvent le moyen le plus rapide de trouver des trucs uniques: my @stuff = (1,2,3,3, "somestring"); mon% unique; foreach mon $ foo (@stuff) {$ unique {$ foo} = 1; } imprimer les clés% unique; –

Répondre

4

Il y a probablement d'autres modules CPAN pour cela, mais voici une façon:

use Math::Combinatorics qw(combine); 
my @comb = combine(6, 1..10); 
3

(ça sent un peu comme un problème de travail, donc je ne vais vous donner un indice)

A chaque itération vous devez stocker @sorted_numbers un endroit, par exemple:

while (my @permutation = $permutor->next) { 
    ... 
    @sorted_numbers = sort { $a <= > $b } @numbers; 
    push(@combinations, ...); 
} 

my @unique_combinations = uniq @combinations; 
foreach (@unique_combinations) { ... } 

vous VHA e pour savoir ce qu'il faut pousser sur la liste @combinations de sorte que l'appel à uniq fera ce que vous voulez.

Quelques autres pointeurs:

(1,2,3,4,5,6,7,8,9,10) may be written (1..10) 

Vous pouvez calculer directement à partir @numbers@permutation avec un array slice:

my @numbers = @permutation[0..5]; 
Questions connexes