Немного програзма.
Операторы связи часто обмениваются друг с другом интервалами или диапазонами номеров. Например, диапазон это 4167700-4167899. А вот телефонные станции оперируют префиксами. То есть теми частями номера, которые в этом интервале не изменяются, в последующие цифры могут быть любыми. В вышеупомянутом примере это будет два префикса 41677 и 41678. Перелопачивать ручками десятки интервалов не самое интересное занятие, да и вероятность ошибки велика. Находясь в Ла Риохе (Испания) и под винными парами после дегустации замечательных напитков, я написал вот такую прелестную программку.
Кто поймёт как программа работает, тому зачёт. Написал со сторонним эффектом тк здесь он, мне кажется, вполне оправдан. Переменная dmax - это максимальная глубина погружения при поиске префиксов. Это можно вообще убрать. Я поставил тк мне стрёмно поведение рекурсивных алгоритмов с глубиной в десяток порядков.
На вход ей можно дать пары "начало:конец" интервалов с любыми разделителями. На выходе будут префиксы.
Программа распиливает диапазон на наименьшее возможное количество префиксов.
Пользуйтесь на здоровье. Не забывайте хвалить, размещать ссылки, рекомендовать товарищам, упоминать при использовании в ваших продуктах и платить роялти при использовании в продуктах коммерческих. Ибо GPL это.
#!/usr/bin/perl -w
# Sergei Keler (www.keler.net).
# Interval to Prefixes.
use strict;
# На входе пары типа начало:конец построчно
# Разделитель любой, :., таб - и пробел.
# На выходе префиксы.
my @r=(); # массив префиксов исключительно ради сортировки. Можно не использовать.
my $dpt=0;
my $dmax=1000000; # Максимальная глубина поиска.
# Просто читаем пары чисел с любым разделителем.
while (<>) {
chomp;
my ($s,$f)=split /[ \t:,.-]/;
$dpt=0;
maxint($s,$f); # преобразуем
}
# вывод.
foreach my $p (sort @r) {
print "$p\n";
}
# Собственно логика тут.
sub maxint {
my ($s,$f)=@_;
return if $dpt++ > $dmax;
if ($s == $f) {
push @r,$s; # Можно print $s;
return;
}
return if ($s > $f);
if (($s % 10) != 0) {
push @r,$s; # Можно print $s;
return maxint($s+1,$f);
}
if (($f % 10) != 9) {
push @r,$f; # Можно print $f;
return maxint($s,$f-1);
}
return maxint(int($s/10), int($f/10));
}