Как я могу получить диапазоны из списка целых чисел в Perl? - PullRequest
4 голосов
/ 21 апреля 2010

У меня есть массив чисел:

@numbers = 1,2,3,6,8,9,11,12,13,14,15,20

и я хочу напечатать это так:

1-3,6,8-9,11-15,20

Есть мысли? Конечно, я пытался использовать самые распространенные «циклы», но все равно не получил.

Ответы [ 3 ]

12 голосов
/ 21 апреля 2010

Вы можете использовать Set :: IntSpan :: Fast :

use Set::IntSpan::Fast;

my @numbers = (1,2,3,6,8,9,11,12,13,14,15,20);

my $set = Set::IntSpan::Fast->new;
$set->add(@numbers);
print $set->as_string, "\n";
4 голосов
/ 21 апреля 2010

Вот один из возможных способов:

@numbers = (1,2,3,6,8,9,11,12,13,14,15,20);
@list = ();
$first = $last = shift @numbers;
foreach (@numbers,inf) {
  if ($_ > $last+1) {
    if ($first == $last) {
      push @list, $first;
    } elsif ($first+1 == $last) {
      push @list, $first, $last;
    } else {
      push @list, "$first-$last";
    }
    $first = $_;
  }
  $last = $_;
}

print join ',', @list;
1 голос
/ 21 апреля 2010
@numbers=sort { $a <=> $b } @numbers;
push @numbers, inf;

@p=();
$ra = shift @numbers;
$rb = $ra;
for $n (@numbers) {
  if ($n > $rb +1) {
      push @p, ($ra == $rb ? "$ra" : "$ra-$rb");

      $ra = $n;
  }

  $rb = $n;
}

print join(',', @p); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...