распечатывать уникальные строки в Perl - PullRequest
2 голосов
/ 30 августа 2011

Я столкнулся с проблемой математики. Учитывая десять чисел (в данном случае числа от 1 до 10), сколько существует уникальных комбинаций из шести чисел? Короткий ответ - 210. Однако я хотел бы знать, что это за комбинации.

Я собрал следующий код. Первый цикл while работает отлично для создания множества отсортированных комбинаций, однако я не смог распечатать только уникальные комбинации строк. Как я могу распечатать эти уникальные строки?

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 ]

4 голосов
/ 30 августа 2011

Возможно, для этого есть другие CPAN-модули, но есть один способ:

use Math::Combinatorics qw(combine);
my @comb = combine(6, 1..10);
3 голосов
/ 30 августа 2011

(это очень похоже на проблему с домашним заданием, поэтому я только дам вам подсказку)

На каждой итерации вам нужно хранить @sorted_numbers какое-то место, например ::1004

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

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

Итак, вам нужно выяснить, что нужно добавить в список @combinations, чтобы вызов uniq делал то, что вы хотите.

Некоторые другие указатели:

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

Вы можете вычислить @numbers непосредственно из @permutation с помощью среза массива :

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