Найти в Дзене

Алгоритм решения задания 13 ЕГЭ по информатике. Часть 3

Ранее мы уже разобрали алгоритм решения первых четырёх типов 13 заданий ЕГЭ по информатике. В этой же статье посвятим себя оставшимся трём типа. Характерной особенностью разбираемых заданий будет наличие некоторого неопределённого числа в записи IP-адреса или маски сети. Именно это число нам и придётся подбирать в цикле, попутно строя сеть с данными из задания и проверяя все необходимые условия для адресов этой сети. Разделение по типам будет такое: Сначала рассмотрим такое задание: Задание 1317 «Сеть, в которой содержится узел с IP-адресом 240.224.A.60, задана маской сети 255.255.255.128, где A — некоторое допустимое для записи IP-адреса число. Определите минимальное значение A, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество единиц будет больше 13.» Что нам нужно здесь сделать: Начнём решение с импорта функций и записи маски: Маску можно записать как обычной строкой, так и префиксом, если вы помните CIDR-нотацию. Далее пишем цикл, в котором
Оглавление

Ранее мы уже разобрали алгоритм решения первых четырёх типов 13 заданий ЕГЭ по информатике. В этой же статье посвятим себя оставшимся трём типа. Характерной особенностью разбираемых заданий будет наличие некоторого неопределённого числа в записи IP-адреса или маски сети.

Именно это число нам и придётся подбирать в цикле, попутно строя сеть с данными из задания и проверяя все необходимые условия для адресов этой сети.

Разделение по типам будет такое:

  1. В заданиях пятого типа дана маска сети и IP-адрес узла сети с одним отсутствующим байтом (октетом). Нужно найти такое значение этого байта, при котором для всех адресов этой сети будет выполняться заданное условие;
  2. К заданиям шестого типа относятся те, в которых нам даётся маска сети и IP-адрес сети с отсутствующим байтом. Аналогично будем перебирать все допустимые значения для этого байта, при котором для всех адресов этой сети будет выполняться заданное условие;
  3. К оставшемуся — седьмому — типу относятся задания, в которых дан адрес сети и маска с отсутствующим байтом. Требования здесь такие же: перебрать допустимые значения, при которых адреса сети удовлетворяют условию.

Тип 5

Сначала рассмотрим такое задание:

Задание 1317

«Сеть, в которой содержится узел с IP-адресом 240.224.A.60, задана маской сети 255.255.255.128, где A — некоторое допустимое для записи IP-адреса число.

Определите минимальное значение A, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество единиц будет больше 13.»

Что нам нужно здесь сделать:

  1. Построить сеть по данным значениям с неизвестной переменной А;
  2. Эту переменную будем перебирать в цикле;
  3. Для каждого значения A будем проверять, все ли адреса в этой сети имеют количество единиц, большее 13;
  4. Первое же значение А, для которого выполнится условие, выведем на экран — оно и будет минимальным.

Начнём решение с импорта функций и записи маски:

-2

Маску можно записать как обычной строкой, так и префиксом, если вы помните CIDR-нотацию.

Далее пишем цикл, в котором и будем перебирать значения для А:

-3

В нём создаём объект IP-адреса и сеть с этим адресом.

Всегда используйте именно объект IP-адреса, а не обычную f-строку! Зачастую некорректная работа обычных строк с объектами сети приводит к ошибочным ответам.

Нам же осталось только проверить, что во всех адресов построенной сети количество единиц больше 13 и вывести на экран первое же значение А, для которого это условие истинно:

-4

Вместо строчного метода count() здесь можно использовать метод bit_count(), работу которого мы разбирали в прошлой статье.

Запускаем код и получаем ответ на это задание — число 127.

Пример 1

На очереди у нас такое задание:

Задание 1318

«Сеть, в которой содержится узел с IP-адресом 127.215.A.32, задана маской сети 255.255.254.0, где A — некоторое допустимое для записи IP-адреса число.

Определите максимальное значение A, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество нулей в левых двух байтах не больше суммарного количества нулей в правых двух байтах.»

Нечто похожее мы уже решали ранее, так что на объяснение, как получить левые и правые два байта, не будем тратить время.

Импортируем функции, создаём переменную с маской, а в цикле перебираем значения А в обратном порядке, нам ведь нужно найти максимальное:

-5

Далее идут объекты IP-адреса и сети:

-6

В блоке if сравниваем количество нулей в обеих частях адреса:

-7

Запускаем программу и получаем число 241. Его и запишем в ответ.

Пример 2

Последняя для данного типа формулировка:

Задание 1334

«Сеть, в которой содержится узел с IP-адресом 201.154.34.A, задана маской 255.255.255.224, где A — некоторое допустимое для записи IP-адреса число.

Определите количество значений A, для которых у всех узлов в этой сети в двоичной записи количество нулей в третьем байте больше, чем в четвертом.»

Внимательно прочитайте её. Видите отличия от предыдущих? Теперь мы работаем не со всеми адресами сети, а только с адресами её узлов! То есть без широковещательного и адреса сети. Посмотрим, как это отразится на коде.

Начало стандартное:

-8

А вот теперь нам нужно сначала проверить, что объект IP-адреса не является адресом сети и широковещательным:

-9

И только после этого сравнивать количество нулей в третьем (от 16 до 24) и четвёртом (от 24 до 32) байтах:

-10

После запуска этой программы получим число 120, которое и запишем в ответ.

Тип 6

Задания шестого типа могут выглядеть так:

Задание 1315

«Сеть задана IP-адресом 32.0.А.5, где А – некоторое допустимое для записи IP-адреса число, и маской сети 255.255.240.0.

Определите минимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество единиц в левых двух байтах не более суммарного количества единиц в правых двух байтах.»

Условимся, что в первых 5 строчках у нас меняются только значения маски и IP-адреса:

-11

Далее по известному уже принципу сравниваем количество единиц в левых двух и правых двух байтах:

-12

Ответом здесь будет число 16.

Пример 1

Все задания этого типа довольно похожи друг на друга. Формулировка теперь следующая:

Задание 1316

«Сеть задана IP-адресом 127.254.А.10, где А – некоторое допустимое для записи IP-адреса число, и масок сети 255.255.224.0.

Определите максимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество единиц в левых двух байтах не менее суммарного количества единиц в правых двух байтах.»

Решение будет идентично предыдущему, разве что поменяются значения маски и адреса, цикл будет перебирать значения в обратную сторону, а знак «<=» заменим на «>=»:

-13

В результате получим число 159, которое и будет ответом.

Пример 2

Еще одно похожее задание:

Задание 1326

«Сеть задана IP-адресом 16.0.А.5, где А – некоторое допустимое для записи IP-адреса число, и масок сети 255.255.192.0.

Определите минимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество нулей в левых двух байтах не менее суммарного количества нулей в правых двух байтах.»

Решение здесь всё еще шаблонное, разве что теперь считаем количество нулей, а не единиц:

-14

В ответ на это задание записываем число 64.

Тип 7

Начнём разбор 7 типа с такой формулировки:

Задание 1313

«Сеть задана IP-адресом 191.239.130.3 и маской сети 255.255.А.0, где А – некоторое допустимое для записи маски число.

Определите минимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество единиц в левых двух байтах не менее суммарного количества единиц в правых двух байтах.»

В заданиях 7 типа нам нужно будет перебирать значения для отсутствующего байта маски. Но давайте используем другой подход — будем перебирать не значения байта, а куда меньшие значения длины префикса.

Так, если неизвестен третий байт маски, то префикс следует перебирать от 16 до 24. Аналогично с оставшимися: от 0 до 8, от 8 до 16 и от 24 до 32. Но зачастую неизвестным оказывается как раз третий байт.

Приступим к решению. Создадим объект адреса и в цикле будем перебирать значения A от 16 до 24:

-15

Теперь можем построить объект сети по адресу узла и текущему значению префикса:

-16

Далее идёт уже классическая проверка единиц в левых и правых двух байтах адреса:

-17

Но теперь мы не выводим значение переменной А на экран. Нам же нужно получить именно значение третьего байта маски. Значит, как только сработает условие, получаем маску данной сети, разделяем по символу точки и выводим на экран строку под индексом 2, то есть третий байт маски:

-18

Запустив код, получим число 224, которое и запишем в ответ.

Пример 1

Рассмотрим еще одно задание:

Задание 1314

«Сеть задана IP-адресом 255.215.12.5 и маской сети 255.255.А.0, где А – некоторое допустимое для записи маски число.

Определите минимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество нулей в левых двух байтах не более суммарного количества нулей в правых двух байтах.»

Решается оно аналогично предыдущему. Заменяем значение адреса, подсчет единиц на подсчёт нулей и знак нестрого сравнения:

-19

В результате получаем ответ — 192.

Пример 2

Заключительное задание будет с такой формулировкой:

Задание 1324

«Сеть задана IP-адресом 252.63.194.3 и маской сети 255.255.А.0, где А – некоторое допустимое для записи маски число.

Определите минимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество единиц в левых двух байтах не менее суммарного количества единиц в правых двух байтах.»

Решение будет следующим:

-20

А в ответ здесь запишем число 252.

<<< Предыдущая статья Первая статья >>

Больше заданий данного типа с подробным решением вы можете найти в нашем тренажёре.