Ранее мы уже разобрали алгоритм решения первых четырёх типов 13 заданий ЕГЭ по информатике. В этой же статье посвятим себя оставшимся трём типа. Характерной особенностью разбираемых заданий будет наличие некоторого неопределённого числа в записи IP-адреса или маски сети.
Именно это число нам и придётся подбирать в цикле, попутно строя сеть с данными из задания и проверяя все необходимые условия для адресов этой сети.
Разделение по типам будет такое:
- В заданиях пятого типа дана маска сети и IP-адрес узла сети с одним отсутствующим байтом (октетом). Нужно найти такое значение этого байта, при котором для всех адресов этой сети будет выполняться заданное условие;
- К заданиям шестого типа относятся те, в которых нам даётся маска сети и IP-адрес сети с отсутствующим байтом. Аналогично будем перебирать все допустимые значения для этого байта, при котором для всех адресов этой сети будет выполняться заданное условие;
- К оставшемуся — седьмому — типу относятся задания, в которых дан адрес сети и маска с отсутствующим байтом. Требования здесь такие же: перебрать допустимые значения, при которых адреса сети удовлетворяют условию.
Тип 5
Сначала рассмотрим такое задание:
«Сеть, в которой содержится узел с IP-адресом 240.224.A.60, задана маской сети 255.255.255.128, где A — некоторое допустимое для записи IP-адреса число.
Определите минимальное значение A, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество единиц будет больше 13.»
Что нам нужно здесь сделать:
- Построить сеть по данным значениям с неизвестной переменной А;
- Эту переменную будем перебирать в цикле;
- Для каждого значения A будем проверять, все ли адреса в этой сети имеют количество единиц, большее 13;
- Первое же значение А, для которого выполнится условие, выведем на экран — оно и будет минимальным.
Начнём решение с импорта функций и записи маски:
Маску можно записать как обычной строкой, так и префиксом, если вы помните CIDR-нотацию.
Далее пишем цикл, в котором и будем перебирать значения для А:
В нём создаём объект IP-адреса и сеть с этим адресом.
Всегда используйте именно объект IP-адреса, а не обычную f-строку! Зачастую некорректная работа обычных строк с объектами сети приводит к ошибочным ответам.
Нам же осталось только проверить, что во всех адресов построенной сети количество единиц больше 13 и вывести на экран первое же значение А, для которого это условие истинно:
Вместо строчного метода count() здесь можно использовать метод bit_count(), работу которого мы разбирали в прошлой статье.
Запускаем код и получаем ответ на это задание — число 127.
Пример 1
На очереди у нас такое задание:
«Сеть, в которой содержится узел с IP-адресом 127.215.A.32, задана маской сети 255.255.254.0, где A — некоторое допустимое для записи IP-адреса число.
Определите максимальное значение A, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество нулей в левых двух байтах не больше суммарного количества нулей в правых двух байтах.»
Нечто похожее мы уже решали ранее, так что на объяснение, как получить левые и правые два байта, не будем тратить время.
Импортируем функции, создаём переменную с маской, а в цикле перебираем значения А в обратном порядке, нам ведь нужно найти максимальное:
Далее идут объекты IP-адреса и сети:
В блоке if сравниваем количество нулей в обеих частях адреса:
Запускаем программу и получаем число 241. Его и запишем в ответ.
Пример 2
Последняя для данного типа формулировка:
«Сеть, в которой содержится узел с IP-адресом 201.154.34.A, задана маской 255.255.255.224, где A — некоторое допустимое для записи IP-адреса число.
Определите количество значений A, для которых у всех узлов в этой сети в двоичной записи количество нулей в третьем байте больше, чем в четвертом.»
Внимательно прочитайте её. Видите отличия от предыдущих? Теперь мы работаем не со всеми адресами сети, а только с адресами её узлов! То есть без широковещательного и адреса сети. Посмотрим, как это отразится на коде.
Начало стандартное:
А вот теперь нам нужно сначала проверить, что объект IP-адреса не является адресом сети и широковещательным:
И только после этого сравнивать количество нулей в третьем (от 16 до 24) и четвёртом (от 24 до 32) байтах:
После запуска этой программы получим число 120, которое и запишем в ответ.
Тип 6
Задания шестого типа могут выглядеть так:
«Сеть задана IP-адресом 32.0.А.5, где А – некоторое допустимое для записи IP-адреса число, и маской сети 255.255.240.0.
Определите минимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество единиц в левых двух байтах не более суммарного количества единиц в правых двух байтах.»
Условимся, что в первых 5 строчках у нас меняются только значения маски и IP-адреса:
Далее по известному уже принципу сравниваем количество единиц в левых двух и правых двух байтах:
Ответом здесь будет число 16.
Пример 1
Все задания этого типа довольно похожи друг на друга. Формулировка теперь следующая:
«Сеть задана IP-адресом 127.254.А.10, где А – некоторое допустимое для записи IP-адреса число, и масок сети 255.255.224.0.
Определите максимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество единиц в левых двух байтах не менее суммарного количества единиц в правых двух байтах.»
Решение будет идентично предыдущему, разве что поменяются значения маски и адреса, цикл будет перебирать значения в обратную сторону, а знак «<=» заменим на «>=»:
В результате получим число 159, которое и будет ответом.
Пример 2
Еще одно похожее задание:
«Сеть задана IP-адресом 16.0.А.5, где А – некоторое допустимое для записи IP-адреса число, и масок сети 255.255.192.0.
Определите минимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество нулей в левых двух байтах не менее суммарного количества нулей в правых двух байтах.»
Решение здесь всё еще шаблонное, разве что теперь считаем количество нулей, а не единиц:
В ответ на это задание записываем число 64.
Тип 7
Начнём разбор 7 типа с такой формулировки:
«Сеть задана IP-адресом 191.239.130.3 и маской сети 255.255.А.0, где А – некоторое допустимое для записи маски число.
Определите минимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество единиц в левых двух байтах не менее суммарного количества единиц в правых двух байтах.»
В заданиях 7 типа нам нужно будет перебирать значения для отсутствующего байта маски. Но давайте используем другой подход — будем перебирать не значения байта, а куда меньшие значения длины префикса.
Так, если неизвестен третий байт маски, то префикс следует перебирать от 16 до 24. Аналогично с оставшимися: от 0 до 8, от 8 до 16 и от 24 до 32. Но зачастую неизвестным оказывается как раз третий байт.
Приступим к решению. Создадим объект адреса и в цикле будем перебирать значения A от 16 до 24:
Теперь можем построить объект сети по адресу узла и текущему значению префикса:
Далее идёт уже классическая проверка единиц в левых и правых двух байтах адреса:
Но теперь мы не выводим значение переменной А на экран. Нам же нужно получить именно значение третьего байта маски. Значит, как только сработает условие, получаем маску данной сети, разделяем по символу точки и выводим на экран строку под индексом 2, то есть третий байт маски:
Запустив код, получим число 224, которое и запишем в ответ.
Пример 1
Рассмотрим еще одно задание:
«Сеть задана IP-адресом 255.215.12.5 и маской сети 255.255.А.0, где А – некоторое допустимое для записи маски число.
Определите минимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество нулей в левых двух байтах не более суммарного количества нулей в правых двух байтах.»
Решается оно аналогично предыдущему. Заменяем значение адреса, подсчет единиц на подсчёт нулей и знак нестрого сравнения:
В результате получаем ответ — 192.
Пример 2
Заключительное задание будет с такой формулировкой:
«Сеть задана IP-адресом 252.63.194.3 и маской сети 255.255.А.0, где А – некоторое допустимое для записи маски число.
Определите минимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество единиц в левых двух байтах не менее суммарного количества единиц в правых двух байтах.»
Решение будет следующим:
А в ответ здесь запишем число 252.
<<< Предыдущая статья Первая статья >>
Больше заданий данного типа с подробным решением вы можете найти в нашем тренажёре.