SHARE
TWEET

DJ-Andrey-sXe — tltcomp ISP comparision table generator, GPL

a guest Feb 2nd, 2012 85 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/perl -w
  2. use strict;
  3.  
  4. # my $data = {
  5. #       'Провайдер 1' => {
  6. #               'скорость'       => цена,
  7. #               'скорость,ночью' => цена,
  8. #       },
  9. #   ...
  10. # };
  11.  
  12. my %data = (
  13.          
  14.         'FlyGo' => {
  15.                 '1000,2000',    300, # Fly-1
  16.                 '6000,12000',   450, # Fly-6
  17.                 '10000,16000',  750, # Fly-10
  18.                 '12000,25000', 1100, # Fly-12
  19.         },
  20.  
  21.         'Аист' => {
  22.                 1000, 500, # Лайт
  23.                 8000, 500, # Лето круглый год
  24.  
  25.                  256, 450, # NET.256
  26.                  512, 500, # NET.512
  27.                 1000, 700, # NET.1024
  28.                 2000, 900, # NET.2048
  29.  
  30.                 '1000,2000', 500, # MEGANET 1
  31.                 '2000,4000', 650, # MEGANET 2
  32.  
  33.                 10000, 500, # МегаБУМ 10
  34.                 12000, 550, # МегаБУМ 12
  35.                 15000, 600, # МегаБУМ 15
  36.  
  37.                 10000, 600, # МегаБУМ 10+
  38.                 12000, 650, # МегаБУМ 12+
  39.                 15000, 700, # МегаБУМ 15+
  40.  
  41.                 # 2000, 330, # Юниор (акция, не участвует, а жаль, его бы на постоянку)
  42.         },
  43.  
  44.         'Айдо' => {
  45.                 '1500,3000',   350, # до 3
  46.                 '8000,16000',  450, # до 12
  47.                 '11000,22000', 550, # до 17
  48.                 '15000,30000', 650, # до 23
  49.                 '20000,40000', 999, # до 30
  50.         },
  51.  
  52.         'Би' => {
  53.                 '12000,20000', 650, # «Новогодний 2012»
  54.                 '15000,20000', 875, # «Новогодний 2012»
  55.                 '10000,20000', 450, # «Новогодний 2012»
  56.                 10000        , 550, # Скорость+
  57.                 '10000,20000' , 450, # Безлимитный 450
  58.                 '12000,20000' , 650, # Безлимитный 650
  59.                 '15000,20000' , 875, # Безлимитный 875
  60.  
  61.                 # был, но больше нету
  62.                 #  '3000,9000'  , 295,
  63.         },
  64.  
  65.         'ВТ' => {
  66.                 '4000,10000',   450, # Отдыхай NEW FTTB
  67.                 '6000,15000',   650, # Качай NEW FTTB
  68.                 '8000,20000',   850, # Отрывайся NEW FTTB
  69.                 # adsl
  70.                 '2560,4000', 450, # Отдыхай NEW
  71.                 '4000,6000', 650, # Качай NEW
  72.                 '5632,8000', 850, # Отрывайся NEW
  73.                    64,       250, # Социальный
  74.         },
  75.  
  76.         'ИЛ' => {
  77.                   512, 400, # Безлимитный интернет 512 Кбит/сек
  78.                 10000, 450, # Безлимитный интернет 10 Мбит/сек
  79.                 15000, 600, # Безлимитный интернет 15 Мбит/сек
  80.                 20000, 900, # Безлимитный интернет 20 Мбит/сек
  81.                 50000, 3000, # Безлимитный интернет 50 Мбит/сек
  82.                 12000, 495, # 12+
  83.                   256, 250, # Социальный
  84.         },
  85.  
  86.         'ИП' => {
  87.                  512, 300,
  88.                 1000, 450,
  89.                 2000, 700,
  90.         },
  91.  
  92.         'Крафт' => {
  93.                   256,  290, # безлимитные сразу с учётом порога
  94.                   512,  708, # безлимитные сразу с учётом порога
  95.                  1000,  645, # "ступени" с учётом "качаю сколько хочу"
  96.                  2000,  803, # "ступени" с учётом "качаю сколько хочу"
  97.                  4000,  991, # "ступени" с учётом "качаю сколько хочу"
  98.                 10000, 1658, # "ступени" с учётом "качаю сколько хочу"
  99.         },
  100.  
  101.         'ОПТИ' => {
  102.                  128, 250, # Домашний 128
  103.                  256, 450, # Домашний 256
  104.                  512, 700, # Домашний 512
  105.                 1000, 950, # Домашний 1024
  106.         },
  107.  
  108.         'ТТ' => {
  109.                  4000, 350, # БЕЗЛИМИТ 4
  110.                  6000, 450, # БЕЗЛИМИТ 6
  111.                  8000, 550, # БЕЗЛИМИТ 8
  112.                 10000, 650, # БЕЗЛИМИТ 10
  113.                 12000, 750, # БЕЗЛИМИТ 12
  114.         },
  115.  
  116.         'СТ' => {
  117.                 3000, 300, # Универсальный
  118.                 6000, 400, # Комфорт
  119.                 8000, 450, # Скорость
  120.                 10000, 650, # Скорость плюс
  121.         },
  122.  
  123.         'ТЛТ.РУ' => {
  124.                 8000, 400, # Драйв
  125.         },
  126.  
  127.         'ГТ' => {
  128.                 512, 450,
  129.                 768, 650,
  130.                 1000, 875,
  131.                 2000, 1300,
  132.         },
  133.  
  134. );
  135.  
  136. # скорости. все, какие есть у всех провайдеров, уникально
  137. my %speeds;
  138.  
  139. # 1. иду по всем скоростям и дописываю ночную там, где неопределено
  140. for my $provider ( keys %data )
  141. {
  142.         for my $speed ( keys %{$data{$provider}} )
  143.         {
  144.                 if ( $speed !~ m/,/ ) # нет ночной?
  145.                 {
  146.                         # сделаем
  147.                         my $speed_night = "$speed,$speed";
  148.                         $data{$provider}{$speed_night} = $data{$provider}{$speed};
  149.                         # а без ночной удалим
  150.                         delete $data{$provider}{$speed};
  151.                         $speeds{ $speed_night }++;
  152.                 }
  153.                 else
  154.                 {
  155.                         $speeds{ $speed }++;
  156.                 }
  157.         }
  158. }
  159.  
  160. # изначально все цены хороши
  161. # тупо копируем
  162. my %good;
  163. for my $provider ( keys %data )
  164. {
  165.         for my $speed ( keys %{$data{$provider}})
  166.         {
  167.                 $good{$provider}{$speed} = $data{$provider}{$speed};
  168.         }
  169. }
  170.  
  171. # а теперь уберём из хороших цен такие, что не соответствуют правилу:
  172. # лучшая цена = Быстрее и дешевле нет ни у кого
  173. for my $provider ( keys %good )
  174. {
  175.         # for my $speed ( $data{$provider} )
  176.         for my $speed ( keys %{$data{$provider}} )
  177.         {
  178.                 # если есть лучше,
  179.                 if ( compare_speed_and_price($speed,$data{$provider}{$speed}) )
  180.                 {
  181.                         # удалить из хороших
  182.                         delete $good{$provider}{$speed};
  183.                 }
  184.         }
  185. }
  186.  
  187. print "<table cellspacing='0' class='isp-compare'><tr>\n";
  188. print "<th>Скорость<br>(бит/с)</th>\n";
  189. for ( sort keys %data )
  190. {
  191.         print "<th>$_</th>\n";
  192. }
  193. print "</tr>\n";
  194.  
  195. for my $each_speed
  196. (
  197.         sort
  198.         {
  199.                 int_left($a) <=> int_left($b)
  200.                 or
  201.                 int_right($a) <=> int_right($b)
  202.         }
  203.         keys %speeds
  204. )
  205. {
  206.         my $each_speed_for_output = $each_speed;
  207.         if ( $each_speed =~ m/(\d+),(\d+)/ )
  208.         {
  209.                 if ( $1 == $2 )
  210.                 {
  211.                         $each_speed_for_output = ( $1 > 999 ) ? $1/1000 . " M" : "$1 K";
  212.                 }
  213.                 else
  214.                 {
  215.                         $each_speed_for_output = ( $1 > 999 ) ? $1/1000 . " M" : "$1 K";
  216.                         $each_speed_for_output .= ( $2 > 999 ) ? "<br><img class='night'>" . $2/1000 . " M" : "<br>$2 K";
  217.                 }
  218.         }
  219.  
  220.         print "<tr><td>$each_speed_for_output</td>\n";
  221.         for my $provider ( sort keys %data )
  222.         {
  223.                 my $price = 0;
  224.                 my $css_class = 'not-best';
  225.                 for my $speed ( keys %{$data{$provider}} )
  226.                 {
  227.                         if ( $each_speed eq $speed )
  228.                         {
  229.                                 $price = $data{$provider}{$speed};
  230.                                 if
  231.                                 (
  232.                                         defined($price)
  233.                                         and
  234.                                         exists($good{$provider}{$speed})
  235.                                         and
  236.                                         $price == $good{$provider}{$speed}
  237.                                 )
  238.                                 {
  239.                                         $css_class = 'good';
  240.                                 }
  241.                         }
  242.                 }
  243.  
  244.                 if ( $price )
  245.                 {
  246.                         print " <td class='$css_class'>$price</td>\n";
  247.                 }
  248.                 else
  249.                 {
  250.                         print " <td>&nbsp;</td>\n";
  251.                 }
  252.  
  253.         }
  254.  
  255.         print "</tr>\n";
  256. }
  257.  
  258. print "</table>\n";
  259.  
  260. # use Data::Dumper; print Dumper \%data; exit;
  261. # use Data::Dumper; print Dumper \%good; exit;
  262. # use Data::Dumper; print Dumper \%speeds; exit;
  263.  
  264. #========================================================================
  265. # из строки отдать \d+|
  266. #========================================================================
  267. sub int_left
  268. {
  269.         my $a = shift;
  270.         $a =~ s/,\d+$//g;
  271.         return $a;
  272. }
  273.  
  274. #========================================================================
  275. # из строки отдать |\d+
  276. #========================================================================
  277. sub int_right
  278. {
  279.         my $a = shift;
  280.     $a =~ m/,(.+)/;
  281.         return $1;
  282. }
  283.  
  284. #========================================================================
  285. # Есть ли быстрее и дешевле?
  286. # что такое быстрее и дешевле?
  287. # это когда
  288. # $speed_my < speed_looking_at and $price_my > price_looking_at
  289. #========================================================================
  290. sub compare_speed_and_price
  291. {
  292.         my $speed_my = shift;
  293.         my $price_my = shift;
  294.  
  295.         for my $provider ( keys %data )
  296.         {
  297.                 for my $speed ( keys %{$data{$provider}} )
  298.                 {
  299.                         if ( int_left($speed_my) < int_left($speed) and $price_my >= $data{$provider}{$speed} )
  300.                         {
  301.                                 return 1;
  302.                         }
  303.                 }
  304.         }
  305.  
  306.         # лучше, чем дано, нет
  307.         return 0;
  308. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top