Я предполагаю, основываясь на данных, что ваши номера являются последовательными, но обтекание 100. Таким образом, вы нашли бы «старт», заказав все, затем ищет разрыв. (Это прерывается, если у вас есть полный цикл!)
#!/usr/bin/env perl
use strict;
use warnings;
my @numbers = (1,2,3,4,5,97,98,99);
#sort them
my @sorted = sort { $a <=> $b } @numbers;
#rotate the numbers until your 'gap' is off the end of the cycle.
my $splice = 0;
for (my $index = 0; $index < $#numbers; $index++) {
print 1+$sorted[$index] % 100,",";
print $sorted[$index+1] % 100,"\n";
if (($sorted[$index] + 1) %100 < $sorted[$index+1] % 100) {
$splice = $index;
}
}
print "Splicing on $splice\n";
@numbers = (splice (@sorted, $splice+1, @sorted - $splice), splice (@sorted, 0, $splice+1));
print join ",", @numbers;
Редактировать: Хорошо, новые тестовые примеры. Могут не работать для них. Надеюсь, это иллюстрирует подход. Но с пробелами в вашем заказе (я не предполагал пробелов) это очень сложно сказать, потому что вы в основном ищете самый большой разрыв.
Откуда вы знаете, что начинаете с 97? Все ли номера последовательны? – Sobrique
Нет, он не может начинаться ни с одним случайным, ни между 1-99 .. приведенным выше, это просто пример .. значения достигнут 99, и он начнется с 01 снова, и он будет загружен при некотором случайном значении. – nithin
@nithin Он начинается с '1' или' 01'? – TLP