Sergei Keler (nw_wind) wrote,
Sergei Keler
nw_wind

Интервал в префиксы. Простая программа преобразования.

Немного програзма.

Операторы связи часто обмениваются друг с другом интервалами или диапазонами номеров. Например, диапазон это 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));
}

Tags: pbx, атс, програзм, телефон
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 9 comments