-
Notifications
You must be signed in to change notification settings - Fork 0
/
task.txt
75 lines (51 loc) · 4.66 KB
/
task.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
Задание 2
Фильтрация IP-адресов
Реализуем утилиту для эффективной сортировки и фильтрации лога IP-адресов.
Продолжаем пользоваться сборочной фермой для публикации пакета.
Программа из стандартного ввода читает данные. Данные хранятся построчно.
Каждая строка состоит из трех полей, разделенных одним символом табуляции, и завершается символом конца строки.
Формат строки:
text1 \t text2 \t text3 \n
Поля text2 и text3 игнорируются. Поле text1 имеет следующую структуру (ip4 address):
n1.n2.n3.n4
где n1..4 – целое число от 0 до 255.
Требуется загрузить список ip-адресов в память и отсортировать их в обратном
лексикографическом порядке. Пример лексикографической сортировки (по первому числу, затем по второму и так далее):
1.1.1.1
1.2.1.1
1.10.1.1
Соответственно, обратная:
1.10.1.1
1.2.1.1
1.1.1.1
Обратите внимание – сортировка выполняется в байтовом (численном) представлении IP-адреса, а не в строковом.
Поэтому адрес, например, 1.2.1.1 меньше адреса 1.10.1.1 (ведь 2 < 10).
Далее выводим в стандартный вывод следующее:
1. Полный список адресов после сортировки. Одна строка - один адрес.
2. Сразу следом список адресов, первый байт которых равен 1.
Порядок сортировки не меняется. Одна строка - один адрес. Списки ничем не разделяются.
3. Сразу продолжается список адресов, первый байт которых равен 46, а второй 70.
Порядок сортировки не меняется. Одна строка - один адрес. Списки ничем не разделяются.
4. Сразу продолжается список адресов, любой байт которых равен 46.
Порядок сортировки не меняется. Одна строка - один адрес. Списки ничем не разделяются.
Требования к реализации
В приложенном к заданию исходном файле необходимо заменить, где это возможно,
конструкции на аналогичные из стандарта С++14/C++17. Реализовать недостающий функционал.
Не обязательно следовать приложенному шаблону. Можно выполнить задание, оформив код
любым корректным способом.
Лишний раз проверьте
1. Лексикографическая сортировка понятна как для строки, так и для контейнера.
2. Выбрана соответствующая задаче структура данных.
Самопроверка
Макет исходного кода, а также тестовый файл с данными ip_filter.tsv прилагается к материалам
занятия. Проверить себя можно следующим образом (Linux):
cat ip_filter.tsv | ip_filter | md5sum
24e7a7b2270daee89c64d3ca5fb3da1a -
Внимание! Из-за различного толкования символа ‘\n’ на Linux и Windows,
вышеприведенный хэш актуален только для Linux-систем. В случае, если Ваша рабочая система Windows,
придумайте способ, как проверить реализацию, имея эталонный результат только для Linux.
Пакет ip_filter, содержащий исполняемый файл ip_filter, должен быть опубликован в качестве
релиза в репозитории.
Дополнительное упражнение
Добавить unit-тесты для реализации на понравившемся тестовом framework-е (рекомендуем
GoogleTest).