Раздел «Язык Ruby».RubyTest2:

Тест по Ruby (часть 2)

Задача 1. (обработка лога) По данному логу web-сервера Apache построить таблицу вида:

IP down сколько килобайт передано на этот IP
... ...
194.16.12.1 123.23
194.85.12.1 120.12

Строчки должны быть упорядочены по второму столбцу по убыванию. Числа выводить с точностью до двух цифр после десятичной точки.

Формат одной строки лога:

<IP> - - [ <дата> ] "(GET|POST) <url> <протокол>" <код> 
      <число переданных байт> <информация о клиенте>

Пример:

66.249.72.172 - - [17/May/2007:12:56:50 +0400] "GET /A/ru/bin/view/Home/WebHome?
CGISESSID=78810213bfa324b8d7386e8023e14b11 HTTP/1.1" 200 20465 In:- Out:-:- "-" "Mozilla/5.0 
(compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

(дополнительно) Используя библиотеку geoip или любую другую подобную библиотеку выведите также детализацию трафика по странам (см. также ip2location).

Задача 2. (алгоритмы на графах) Реализуйте класс Graph с функциями Graph.new(initial_vertises, options), Graph#insert_edge, Graph#remove_edge, Graph#update_edge, Graph#shortest_path, Graph#connected_components, Graph#clousure, Graph#clousure!, Graph#each_edge, Graph#each_vertice.

Примеры работы:

g = Graph.new(nil, :undirected=>true, :edgeweighted=>true);
g.insert_edge("Moscow", "Vologda", 44)
g.insert_edge("Peru", "Rio", 88)
g.insert_edge("Vologda", "Brusel", 188)
g.insert_edge("Moscow", "Minsk",  55)
g.insert_edge("Minsk",  "Praha",  66)
g.insert_edge("Brusel", "Praha", 11)
g.shortest_path("Moscow", "Brusel")
# => [["Moscow", "Minsk", "Praha", "Brusel"], 132]
g.connected_components
# => Set: { Set:{"Moscow", "Minsk", "Praha", "Brusel", "Vologda"},  Set:{"Peru", "Rio"} }
g.each_edge do |source,target,weight|
   puts "#{source}-#{target}: #{weight}"
end
g.each_edge do |source,target,weight|
   q.remove_edge(source,target) if source == "Vologda"
end

g.clousure! # замыкание графа;
            # из "графа дорог" получается "граф кратчайших путей", то есть
            # получаем набор графов (связных компонент), в которых 
            # две вершины соединены ребром u-->v тогда и только тогда, когда есть путь
            # из u в v. Вес этого ребра - длина кратчайшего пути. 
            # Cм. алгоритм Флойда-Уоршала

g.each_edge do |source,target,weight|
   puts "#{source}-#{target}: #{weight}"
end

Реализовать следующие булевы опции: :undirected, :edge_weighted, :vertice_weighted.

Реализовать следующие численные опции: :default_edge_weight, :default_vetrice_weight.

Attachment sort Action Size Date Who Comment
apachelog.txt manage 25.7 K 17 May 2007 - 10:09 ArtemVoroztsov Пример лога Web-сервера Apache