Тест по Ruby (часть 2)
Задача 1. (обработка лога) По данному логу web-сервера Apache построить таблицу вида:
Строчки должны быть упорядочены по второму столбцу по убыванию.
Числа выводить с точностью до двух цифр после десятичной точки.
Формат одной строки лога:
IP | сколько килобайт передано на этот 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 с функциями
Реализовать следующие булевы опции: :undirected, :edge_weighted, :vertice_weighted.
Реализовать следующие численные опции: :default_edge_weight, :default_vetrice_weight.
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