Как получить все возможные комбинации соседних предметов в последующем порядке, используя Perl? - PullRequest
3 голосов
/ 12 сентября 2010

Например, у меня есть массив

my @arr = qw(0 1 2 3 4);

Как получить следующие комбинации:

0
01
012
0123
01234
1
12
123
1234
2
23
234
3
34
4

Если есть, как называется такая комбинация (или перестановка))?

Спасибо, как всегда!

Ответы [ 3 ]

7 голосов
/ 12 сентября 2010

Лично я нахожу «стиль C» для цикла, который gbacon часто использует без необходимости. И, как правило, его можно заменить на «цикл в стиле» для цикла, который легче следовать.

#!/usr/bin/perl

use strict;
use warnings;

my @arr = qw(0 1 2 3 4);

my @result;
for my $i (0 .. $#arr) {
  for my $j ($i .. $#arr) {
    push @result => [ @arr[$i .. $j] ];
  }
}

print @$_, "\n" for @result;
6 голосов
/ 12 сентября 2010

Использовать фрагменты массива:

#! /usr/bin/perl

use warnings;
use strict;

my @arr = qw(0 1 2 3 4);

my @result;
for (my $i = 0; $i < @arr; $i++) {
  for (my $j = $i; $j < @arr; $j++) {
    push @result => [ @arr[$i .. $j] ];
  }
}

print @$_, "\n" for @result;

Вывод:

0
01
012
0123
01234
1
12
123
1234
2
23
234
3
34
4
1 голос
/ 12 сентября 2010

Вот способ разделить проблему на несколько отдельных компонентов:

use strict;
use warnings;

sub consec_subseq_leading {
    # (1, 2, 3) ==> ( [1], [1, 2], [1, 2, 3] )
    return map [ @_[0 .. $_] ], 0 .. $#_;
}

sub consec_subseq {
    # (1, 2, 3) ==> ( F(1, 2, 3), F(2, 3), F(3) )
    # where F = consec_subseq_leading
    my $j = $#_;
    return map consec_subseq_leading( @_[$_ .. $j] ), 0 .. $j;
}

my @cs = consec_subseq(0 .. 4);
print "@$_\n" for @cs;
...