О задании
Задание 6 ЕГЭ по информатике проверяет умение работать с алгоритмами управления исполнителями. С точки зрения программирования задача несложная – нужно переписать алгоритм из условия и построить по нему фигуры.
Основная трудность возникает во второй части, где требуется анализировать построенные фигуры. Для правильного ответа понадобится знание базовых геометрических терминов и внимательность при подсчете значений на изображении.
До 2024 года существовало три подхода к решению:
- Исполнитель Черепаха в среде Кумир
- Графический модуль turtle в Python
- Аналитический метод
Среда Кумир больше не входит в обязательное ПО на ЕГЭ – практически гарантировано, что её не будет на экзамене.
Аналитический метод подходит тем, у кого развито пространственное мышление, и кто может визуализировать алгоритм в голове. Большинство заданий решаются этим способом быстрее других методов.
Мы сосредоточимся на визуализации алгоритмов через модуль turtle в Python. Метод нагляднее и проще для восприятия, а код для решения – типовой. Даже забыв часть кода, вы сможете восстановить решение, используя документацию модуля (доступна по умолчанию в Python).
Формулировки
Условие задания 6 начинается с описания команд исполнителя и информации о записи циклов с примером алгоритма.
Затем следует алгоритм для реализации. Его, чаще всего, можно разделить на три части: отрисовка первой фигуры, перемещение ко второй фигуре без рисования и отрисовка второй фигуры.
После алгоритма указывается искомая величина. По ней задания делятся на:
- Найти точки внутри пересечения фигур
- Найти точки внутри объединения фигур
- Найти площадь или периметр внутри пересечения
- Найти площадь или периметр внутри объединения фигур
С точки зрения написания кода, введём другую типизацию:
- Задания первого типа – работа с точками
- Задания второго типа – работа с отрезками (вычисление площади или периметра)
Каждому типу посвятим отдельную статью. В этой статье разберём базовые формулировки, вспомним пересечение и объединение фигур, выведем типовой алгоритм и научимся решать задания первого типа.
Начнём с ключевых понятий – объединения и пересечения фигур.
Пересечение и объединение фигур
Представим расчерченное поле, где сторона клетки – одна условная единица. На поле есть две фигуры:
- Оранжевый прямоугольник с номером 1
- Зелёный прямоугольник с номером 2
Сдвинем каждую фигуру на одну клетку к центру (оранжевую – вправо, зелёную – влево). Получим три части: часть первой фигуры, часть второй и область «наложения» (обозначена жёлтым цветом и цифрой 3).
Область наложения – это пересечение фигур 1 и 2. Пересечение двух прямоугольников – часть плоскости, принадлежащая обоим прямоугольникам одновременно.
Слово «одновременно» здесь ключевое – оно поможет понять разницу с объединением фигур.
Объединение двух фигур – это фигура из всех точек обеих фигур. Все три части вместе (1, 2 и область пересечения 3) образуют объединение фигур 1 и 2.
Теперь посмотрим на ту же картину через призму точек, принадлежащих фигурам.
Для пересечения всё понятно: есть область, принадлежащая обеим фигурам (жёлтая). Подсчитаем точки пересечения – получаем 9 точек.
С объединением интереснее. До пересечения каждая фигура содержала по 20 точек (5 на длине и 4 на ширине). После пересечения у каждой осталось по 11 уникальных точек (оранжевые и зелёные).
Из 18 точек, которые раньше принадлежали двум фигурам (по 9 у каждой), теперь только 9 общих точек пересечения (жёлтые).
Для подсчёта количества точек объединения фигур мы не можем просто сложить количество точек каждой их этих фигур. Ведь у нас есть еще общие точки на пересечении. Следовательно, необходимо из суммы количества точек этих фигур вычесть количество точек их пересечения.
Давайте подсчитаем здесь количество точек объединения:
5 · 4 + 5 · 4 – 3 · 3 = 20 + 20 – 9 = 31.
Теперь вернёмся к формулировкам 6 заданий.
Точки внутри пересечения
Типовая формулировка: «Определите, сколько точек с целочисленными координатами будут находиться внутри области пересечения фигур, ограниченных заданными алгоритмом линиями».
Здесь нужно найти пересечение фигур и подсчитать количество точек, которые ему принадлежат. Можно считать вручную или использовать геометрические формулы для соответствующих фигур.
Сложнее тут обстоят дела с формулировкой, когда необходимо найти количество точек внутри пересечении, не включая точки на линии.
Например, на изображении только одна точка внутри пересечения не лежит на линии (отмечена синим).
Для большей наглядности, рассмотрим другую фигуру: зелёный прямоугольник с 9 точками на одной стороне и 5 на другой.
Нужно найти количество точек, не лежащих на линиях. Таких «внутренних» точек будет 7 × 3 = 21.
То есть количество точек, не лежащих на линии, будет на 2 штуки меньше, чем общее количество точек на одной стороне. Если изначально на длине прямоугольника лежало по 9 точек, то точек, не лежащих на линии, будет: 9 — 2 = 7.
Точки внутри объединения
Некоторые задания требуют найти точки внутри объединения.
Пример формулировки: «Определите, сколько точек с целочисленными координатами будут находиться внутри объединения фигур, ограниченных заданными алгоритмом линиями».
Решение подобной задачи мы уже рассматривали ранее. Нам необходимо найти количество точек, принадлежащих каждой фигуре и их пересечению, сложить количество точек, принадлежащих фигурам, и отнять от этой суммы количество точек пересечения.
В заданиях на объединение обычно не требуется исключать точки на линиях – формулировки вроде «не включая точки на границах этого объединения» здесь не встречаются.
Площадь и периметр фигуры
Некоторые варианты задания 6 требуют найти площадь или периметр фигур на пересечении или объединении.
Пример: «Определите площадь области пересечения фигур, ограниченных заданными алгоритмом линиями».
Здесь важны не точки, а отрезки между ними. Это найдёт своё отражение в коде. Для предыдущих типов мы расставляем точки контрастных цветов для лучшей видимости. Но для работы с отрезками зададим точкам цвет фона – белый.
Чтобы получить, к примеру, нечто такое:
Видите, как здесь отчётливо различимы единичные отрезки на сторонах прямоугольника? Это как раз за счёт того, что мы расставили точки белого цвета на целочисленных координатах.
То есть сначала строим прямоугольник по заданному алгоритму. Затем расставляем белые точки: 9 по одной стороне и 5 по другой. Этим действием делим стороны прямоугольника на отрезки: 8 на одной стороне и 4 на другой.
Теперь легко вычислить площадь и периметр. Площадь: 8 × 4 = 32. Периметр: 8 + 4 + 8 + 4 = 24.
С базовой теорией разобрались, переходим к алгоритму решения.
Алгоритм решения
Программный код для решения 9 заданий у нас будет строиться из нескольких основных блоков, многие из которых повторяются от задания к заданию:
- Импорт модуля turtle
- Базовая настройка
- Алгоритм из условия
- Расстановка точек
Давайте разберём каждый блок по отдельности. Начнём с импорта. В Python есть несколько способов импорта модулей в ваш код. Они все предоставляют разный функционал и нужны для определённых ситуаций. Мы же остановимся на импорте сразу всех функций из модуля turtle вот такой конструкцией:
Теперь поговорим о базовой настройке отображения окна с графикой. Для начала, отключим анимацию движения черепахи командой tracer(0).
Далее нам необходимо ввести переменную, отвечающую за масштаб изображения, чтобы более отчётливо видеть нарисованные фигуры.
Значение этой переменной нужно будет подбирать вручную, ведь для каждого задания необходим разный масштаб. Можете установить её на значение 20, запустить весь код и проверить, насколько хорошо отображаются все необходимые фигуры.
От масштаба будут зависеть и остальные параметры отображения. Например, мы будем менять размер пера (pensize()) и размер окна (screensize()) для лучшего отображения на выбранном масштабе. Также в зависимости от масштаба будем менять значения для переменной размера точек, которые будем расставлять поверх фигур и цвета этих точек.
Когда мы ищем площадь или периметр, цвет точек (переменная dot_color) выбираем белым, а размер побольше. Когда ищем количество точек, цвет выбираем более контрастным (например, тёмно-красный, синий и т.д.), размер точек (переменная dot_size) выставляем примерно равным размеру линии.
И последний момент: в языке Python исполнитель черепаха изначально направлена по положительному направлению оси абсцисс (вправо). В заданиях ЕГЭ же, предполагается, что «голова черепахи направлена вдоль положительного направления оси ординат» (вверх).
Для полного соблюдения условия можем дописать поворот черепахи влево на 90 градусов, чтобы её голова смотрела вверх.
Но это делать совсем не обязательно – на решение это никоим образом не повлияет.
Весь шаблонный код базовой настройки вместе с импортом можно записать так:
Перейдём к алгоритму движения черепахи из условия. Рассмотрим такой пример:
«Повтори 8 [Вперёд 16 Направо 90 Вперёд 22 Направо 90]
Поднять хвост
Вперёд 5 Направо 90 Вперёд 5 Налево 90
Опустить хвост
Повтори 8 [Вперёд 52 Направо 90 Вперёд 77 Направо 90]».
Здесь чётко можно выделить 3 блока:
- После первого «Повтори 8» черепаха рисует первую фигуру. Немного поразмыслив над алгоритмом, мы поймём, что рисует она прямоугольник.
- Между «Поднять хвост» и «Опустить хвост» идёт блок перемещения черепахи без рисования. То есть она переходит к началу следующей фигуры.
- После второго «Повтори 8», очевидно, рисуется второй прямоугольник.
Сама структура повторения каких-либо действий заданное количество раз сразу наталкивает на мысль об использовании цикла for совместно с функцией range(), в которую передаётся это количество повторений.
Так, описанный выше алгоритм построения первой фигуры можно записать следующим образом:
Если вы еще не знакомы с командами из модуля turtle, то настоятельно рекомендуем сначала прочитать статьи по ссылкам:
Теперь реализуем второй алгоритм с перемещением черепахи без рисования:
По аналогии с первым, напишем и третий блок кода:
Остался последний шаг – расставить точки на поле и завершить программу. Для расстановки точек воспользуемся простым алгоритмом:
- Поднимем хвост, чтобы не рисовать лишних линий
- Двумя циклами (один внешний, другой вложенный) будем перебирать целые числа в рамках определённого диапазона.
- Эти перебираемые числа будут координатами, на которые мы отправляем черепаху функцией goto()
- После каждого перемещения будем ставить точку функцией dot() с заданным размером и цветом.
В конце главное корректно завершить исполнение кода. Лучше всего будет написать команду done() – она позволит «зафиксировать» открытым окно с черепахой.
Предположим, что надо расставить точки от начала (0,0) до точки с координатами 10, 10. В коде это записывается так:
На этом почти все. Если вы составите из описанных выше блоков единую программу и запустите, то увидите какие-то странные очень маленькие прямоугольники. Дело в том, что мы совсем забыли про масштаб!
Для реальных заданий мы будем умножать каждое значение линейного перемещения черепахи на переменную scale. То есть умножать будем все числа, которые стоят внутри скобок функций fd(), bk() или goto(). Никакие другие числа трогать не нужно!
Вот теперь мы закончили с разбором алгоритма решения. Давайте скорее опробуем его на реальных заданиях!
Пример 1
Полностью переписывать формулировку задания не будем ограничимся лишь алгоритмом для черепахи и условием.
«Черепахе был дан для исполнения следующий алгоритм:
Повтори 2 [Вперёд 10 Направо 90 Вперёд 18 Направо 90]
Поднять хвост
Назад 6 Направо 90 Вперёд 9 Налево 90
Опустить хвост
Повтори 2 [Вперёд 17 Направо 90 Вперёд 5 Направо 90]
Определите, сколько точек с целочисленными координатами будут находиться внутри пересечения фигур, ограниченных заданными алгоритмом линиями, включая точки на линиях.»
Составляем блок кода с базовыми настройками черепахи:
И переходим к циклу с отрисовкой первой фигуры: Повтори 2 [Вперёд 10 Направо 90 Вперёд 18 Направо 90]. Перенесём все эти команды на язык Python.
Сразу отметим, что для наглядности мы каждую фигуру будем раскрашивать в свой цвет: первую в зелёный, вторую – в оранжевый.
Определим цвет линии с помощью функции color() и перепишем алгоритм из условия, не забывая умножать линейные величины на переменную scale:
Теперь переходим к перемещению черепахи с поднятым хвостом:
Поднять хвост
Назад 6 Направо 90 Вперёд 9 Налево 90
Опустить хвост
В коде это будет выглядеть так:
Вторая же фигура задана таким алгоритмом: Повтори 2 [Вперёд 17 Направо 90 Вперёд 5 Направо 90]. По аналогии с первой, перепишем все это на Python:
И последним блоком кода у нас будут вложенные циклы с расстановкой точек. Значения диапазонов для абсцисс и ординат мы подбираем опытным путём. Вы же можете ставить любые значения, лишь бы нужная область с фигурами была покрыта точками.
Полный код нашей программы будет таким:
Запускаем её и видим на экране следующее изображение.
Приступим к подсчёту точек. Как вы видите, мы не просто так не стали расставлять точки по обеим фигурам. Ведь считать их «пальцем по экрану» не хочется совсем. Давайте оптимизируем задачу. Вспомните простой пример с прямоугольником:
Для его отрисовки черепаха двигалась 8 единиц в одну сторону и 4 в другую. Код был примерно таким:
И, как мы видим, точек внутри фигуры по одной стороне 9, а по другой 5. То есть на одну больше, чем перемещений черепахи в функциях fd().
По такой логике можем смело предположить, что в нашем задании точек на внутри первой фигуры 11 × 19, а внутри второй – 18 × 6.
Подсчитать количество точек на пересечении наших фигур не представляет никакой сложности. Достаточно взять только по одной величине от каждой фигуры: 11 от первой и 6 от второй. Ведь пересечение как раз и ограничено длинами этих сторон.
Перемножив эти два значения, получаем ответ – число 66.
Пример 2
Теперь поработаем с объединением фигур. Формулировка здесь будет следующая:
«Черепахе был дан для исполнения следующий алгоритм:
Повтори 2 [Вперёд 14 Налево 270 Назад 12 Направо 90]
Поднять хвост
Вперёд 9 Направо 90 Назад 7 Налево 90
Опустить хвост
Повтори 2 [Вперёд 13 Направо 90 Вперёд 6 Направо 90]
Определите, сколько точек с целочисленными координатами находится внутри объединения фигур, ограниченного заданными алгоритмом линиями, включая точки на линиях.»
Первый блок кода будет шаблонным:
Далее реализуем цикл отрисовки первой фигуры.
Теперь блок перемещения черепахи с поднятым хвостом:
И нарисуем вторую фигуру:
Осталось добавить точки.
Вся наша программа выглядит так:
После запуска видим на экране следующие прямоугольники.
Подсчитаем количество точек в обоих прямоугольниках, сложим эти два результата и от суммы вычтем количество точек, расположенных на пересечении.
По аналогии с прошлым заданием, сначала вычислим количество точек внутри каждой фигуры. Исходя из алгоритма получаем, что внутри первой фигуры 15 × 13 точек, а внутри второй – 14 × 7.
Теперь подсчитаем точки на пересечении. Одна величина у нас есть – 7. Осталось вычислить вторую. Давайте проанализируем движения черепахи. Первым циклом она нарисовала полностью зелёный прямоугольник и встала в начало координат, повёрнутая вверх. Можете убедиться в этом, оставив анимацию командой tracer(1).
Следовательно, подняв хвост, она переместилась вперёд на 9 единиц по команде fd(9 * scale).
Отсюда легко подсчитать, на сколько оранжевая фигура «заходит» на зелёную: от длины зелёной фигуры (15) отнимем перемещение черепахи с поднятым хвостом: 15 – 9 = 6.
Значит, на пересечении находятся: 7 × 6 = 42 точки.
Вычислим ответ простым выражением: 15 × 13 + 14 × 7 — 7 × 6 = 251.
На этом мы закончим работу с первым типов 6 заданий. В следующей статье научимся работать с площадью и периметром объединения или пересечения фигур.