Черепаха
Черепаха ходит по плоскости и рисует одну или две фигуры, а нам надо сосчитать точки внутри. Рисуем всё шаблоном из тетради, читаем углы фигур с картинки, а точки считаем ручками, умножением.
- 1Что проверяет номер
- 2Способ из тетради
- 3Как считать точки
- 4Объединение и пересечение
- 5Реальные задачи: числа большие
- 6Г-образная фигура и площадь
- 7Ловушки и домашка
Что проверяет номер
Черепаха выполняет программу из команд «Вперёд», «Назад», «Направо», «Налево», «Поднять хвост», «Опустить хвост» и «Повтори». Получается одна или две замкнутые фигуры. Спрашивают почти всегда одно и то же:
Сколько точек с целыми координатами внутри фигуры, в пересечении или в объединении двух фигур. С границей или без неё.
Площадь фигуры или пересечения двух фигур. Иногда нужна только целая часть числа.
Решаем в два шага. Код рисует картинку, по ней читаем координаты углов. Сам счёт делаем ручками: это одно-два умножения.
Способ из тетради
Шаблон один на все задачи. Копируем его и вместо комментария подставляем команды из условия.
from turtle import * tracer(0) # без анимации, рисует мгновенно screensize(10000, 10000) # большой холст, чтобы фигура не вылезла m = 20 # масштаб: 1 шаг из условия = 20 пикселей left(90) # в условии черепаха смотрит вверх # --- команды из условия --- # --- вывод точек --- up() for x in range(-20, 20): for y in range(-20, 20): goto(x * m, y * m) dot(3, 'blue') update() exitonclick()
Команды переводятся так:
| В условии | В коде |
|---|---|
| Вперёд n | fd(n * m) |
| Назад n | bk(n * m) |
| Направо a | rt(a), угол на масштаб не умножаем |
| Налево a | lt(a) |
| Поднять хвост | up() |
| Опустить хвост | down() |
| Повтори k [ … ] | for i in range(k): и все команды из скобок внутрь цикла |
Пример. «Повтори 2 [Вперёд 8 Направо 90 Вперёд 5 Направо 90], Поднять хвост, Вперёд 3 Направо 90 Вперёд 2 Налево 90, Опустить хвост, Повтори 2 [Вперёд 4 Направо 90 Вперёд 9 Направо 90]». Нажми «Запустить», и рисунок появится под кодом.
from turtle import * tracer(0) screensize(10000, 10000) m = 20 left(90) # в условии черепаха смотрит вверх for i in range(2): # первая фигура fd(8 * m); rt(90); fd(5 * m); rt(90) up() fd(3 * m); rt(90); fd(2 * m); lt(90) # переезд к началу второй фигуры down() for i in range(2): # вторая фигура fd(4 * m); rt(90); fd(9 * m); rt(90) up() for x in range(-20, 20): for y in range(-20, 20): goto(x * m, y * m) dot(3, 'blue') update(); exitonclick()
Серые линии на рисунке это оси, они пересекаются в начале координат. Там же начинается первая фигура, и от этой точки удобно считать клетки.
В условии черепаха смотрит вверх, а в Python по умолчанию вправо. Без left(90) вся картинка будет повёрнута, но количество точек останется тем же. Мы пишем эту строку, чтобы рисунок совпадал с условием.
Как считать точки
Прямоугольник считается одним умножением, и код для этого не нужен. Читаем углы с рисунка выше: первая фигура идёт от (0; 0) до (5; 8), вторая от (2; 3) до (11; 7).
Сколько целых значений от 2 до 5? Не три, а четыре: 2, 3, 4, 5. Отсюда главное правило: с границей значений на одно больше длины стороны.
Значит, первая фигура содержит 6 · 9 = 54 точки, а вторая 10 · 5 = 50 точек.
Если границу считать не надо, крайние значения выбрасываем: значений на одно меньше длины стороны. Внутри первой фигуры x от 1 до 4, y от 1 до 7, это 4 · 7 = 28 точек.
| Сторона длиной n | Сколько значений |
|---|---|
| С границей | n + 1 |
| Без границы | n − 1 |
| Для площади | просто n |
Повтори 2 [Вперёд 10 Направо 90 Вперёд 7 Направо 90]. Сколько точек с целыми координатами лежит внутри фигуры, не считая границу?
from turtle import *
tracer(0)
screensize(10000, 10000)
m = 20
left(90)
for i in range(2):
fd(10 * m); rt(90); fd(7 * m); rt(90)
up()
for x in range(-20, 20):
for y in range(-20, 20):
goto(x * m, y * m)
dot(3, 'blue')
update()
exitonclick()
Объединение и пересечение
Пересечение это точки, которые попали в обе фигуры сразу. Объединение это точки, которые попали хотя бы в одну.
Пересечение двух прямоугольников тоже прямоугольник, поэтому считаем его как обычно. В примере выше общая часть идёт по x от 2 до 5, по y от 3 до 7. С границей это 4 · 5 = 20 точек.
Объединение считаем по формуле:
|A ∪ B| = |A| + |B| − |A ∩ B|. Точки общей части попали и в первую, и во вторую фигуру, поэтому один раз их вычитаем.
В нашем примере получается 54 + 50 − 20 = 84 точки.
Повтори 2 [Вперёд 10 Направо 90 Вперёд 7 Направо 90], Поднять хвост, Вперёд 4 Направо 90 Вперёд 3 Налево 90, Опустить хвост, Повтори 2 [Вперёд 9 Направо 90 Вперёд 8 Направо 90]. Сколько точек с целыми координатами лежит в объединении фигур, включая границу?
from turtle import *
tracer(0)
screensize(10000, 10000)
m = 20
left(90)
for i in range(2):
fd(10 * m); rt(90); fd(7 * m); rt(90)
up()
fd(4 * m); rt(90); fd(3 * m); lt(90)
down()
for i in range(2):
fd(9 * m); rt(90); fd(8 * m); rt(90)
up()
for x in range(-20, 20):
for y in range(-20, 20):
goto(x * m, y * m)
dot(3, 'blue')
update()
exitonclick()
Подсказка
Общая часть идёт по x от 3 до 7, по y от 4 до 10.
Реальные задачи: числа большие
Способ тот же, шаблон тот же. Но в настоящих заданиях стороны от 20 до 100, например «Вперёд 86 Направо 90 Вперёд 47». Поэтому меняем две настройки:
- масштаб делаем меньше,
mот 5 до 10, чтобы фигура влезла в экран; - диапазон точек делаем шире, например
range(-10, 100). Если экран тормозит, ставим точки через одну или через пять.
Две тысячи точек по одной никто не считает. По сетке читаем углы фигур, а дальше снова умножаем.
Разбор на настоящей задаче ЕГКР 13.12.2025. Нужно пересечение без границы:
from turtle import * tracer(0) screensize(10000, 10000) m = 10 # фигура 34 × 33, при m = 20 вылезет за экран left(90) for i in range(6): # Повтори 6 [Вперёд 33 Направо 90 Вперёд 20 Направо 90] fd(33 * m); rt(90); fd(20 * m); rt(90) up() fd(3 * m); rt(90); fd(9 * m); lt(90) # Вперёд 3 Направо 90 Вперёд 9 Налево 90 down() for i in range(6): # Повтори 6 [Вперёд 24 Направо 90 Вперёд 25 Направо 90] fd(24 * m); rt(90); fd(25 * m); rt(90) up() for x in range(-5, 40): for y in range(-5, 40): goto(x * m, y * m) dot(3, 'blue') update(); exitonclick()
Первая фигура: x от 0 до 20, y от 0 до 33. Вторая: x от 9 до 34, y от 3 до 27. Общая часть: x от 9 до 20, y от 3 до 27.
Без границы x идёт от 10 до 19, это 10 значений, а y от 4 до 26, это 23 значения. Итого 10 · 23 = 230. Если бы граница считалась, вышло бы 12 · 25 = 300.
Г-образная фигура и площадь
Считаем по строкам
Не всегда получается прямоугольник. «Вперёд 6 Направо 90 Вперёд 3 Направо 90 Вперёд 3 Налево 90 Вперёд 3 Направо 90 Вперёд 3 Направо 90 Вперёд 6» рисует букву Г: снизу прямоугольник 6 × 3, сверху ещё 3 × 3.
from turtle import * tracer(0) screensize(10000, 10000) m = 30 left(90) fd(6 * m); rt(90); fd(3 * m); rt(90); fd(3 * m); lt(90) fd(3 * m); rt(90); fd(3 * m); rt(90); fd(6 * m) up() for x in range(-2, 9): for y in range(-2, 9): goto(x * m, y * m) dot(3, 'blue') update(); exitonclick()
Режем фигуру на строки. С границей: в строках y = 0, 1, 2, 3 по 7 точек, в строках y = 4, 5, 6 по 4 точки. Всего 28 + 12 = 40. Строго внутри получается 16, их так же считаем по строкам.
Формула Пика как проверка
Есть формула, которая связывает площадь с точками: внутренних точек = S − Г / 2 + 1. Здесь S это площадь, а Г это число точек на границе. Если вершины целые, а стороны идут по линиям сетки, Г равно периметру.
Наша фигура: площадь 18 + 9 = 27, периметр 24. Значит, внутри 27 − 12 + 1 = 16, совпало. Основной способ это счёт по строкам, а формула нужна, чтобы проверить себя.
Задачи на площадь
Площадь прямоугольника это просто ширина на высоту, без всяких «плюс один». Для пересечения двух прямоугольников берём общую ширину и общую высоту.
Бывают и косые фигуры, например с углами 135° и 45°. «Повтори 2 [Вперёд 10 Направо 135 Вперёд 10 Направо 45]» рисует ромб со стороной 10 и острым углом 45°. Его площадь a · a · sin(45°) = 100 · 0,7071 ≈ 70,71. В ответ обычно просят целую часть, это 70.
Ромб замыкается за два повтора. Если в условии «Повтори 5», черепаха просто ходит по тем же линиям. Фигура от этого не меняется, смотри на рисунок.
Вперёд 8 Направо 90 Вперёд 4 Направо 90 Вперёд 4 Налево 90 Вперёд 6 Направо 90 Вперёд 4 Направо 90 Вперёд 10. Сколько точек с целыми координатами лежит строго внутри фигуры?
from turtle import *
tracer(0)
screensize(10000, 10000)
m = 30
left(90)
fd(8 * m); rt(90); fd(4 * m); rt(90); fd(4 * m); lt(90)
fd(6 * m); rt(90); fd(4 * m); rt(90); fd(10 * m)
up()
for x in range(-2, 12):
for y in range(-2, 10):
goto(x * m, y * m)
dot(3, 'blue')
update()
exitonclick()
Ловушки и домашка
Нечётное число повторов
Самая дорогая ловушка номера. Один повтор [Вперёд a Направо 90 Вперёд b Направо 90] обходит только половину прямоугольника, а замыкают его два повтора. Если повторов нечётное число, черепаха остаётся не в начале, а в противоположном углу и смотрит вниз. Вторая фигура начинается оттуда.
Настоящая задача с основной волны ЕГЭ-2026: «Повтори 5 [Вперёд 29 Направо 90 Вперёд 27 Направо 90], Поднять хвост, Вперёд 3 Направо 90 Вперёд 9 Налево 90, Опустить хвост, Повтори 5 [Вперёд 72 Направо 90 Вперёд 95 Направо 90]». После первых пяти повторов черепаха стоит в (27; 29), а не в (0; 0). Шаблон сам рисует всё правильно, поэтому углы читаем только с рисунка. Если считать в уме от начала координат, ответ будет неверным.
from turtle import * tracer(0) screensize(10000, 10000) m = 3 left(90) for i in range(5): fd(29 * m); rt(90); fd(27 * m); rt(90) print(xcor() / m, ycor() / m, heading()) # где стоит черепаха и куда смотрит up() fd(3 * m); rt(90); fd(9 * m); lt(90) down() for i in range(5): fd(72 * m); rt(90); fd(95 * m); rt(90) update(); exitonclick()
Строка с print необязательна. Это проверка, если сомневаешься, откуда пошла вторая фигура. Первая фигура идёт по x от 0 до 27, по y от 0 до 29, вторая по x от −77 до 18, по y от −46 до 26. Общая часть: 19 · 27 = 513 точек с границей.
Остальное одним списком
| Ловушка | Как не попасться |
|---|---|
| С границей или без | Читай конец условия. С границей значений n + 1, без неё n − 1 |
| Умножили угол на масштаб | На m умножаем только длины |
| Фигура вылезла за диапазон точек | Проверь, что видны все углы, и расширь range |
| Точки слились в кашу | Маленькая фигура: m больше, 20–40. Большая: m меньше и точки реже |
| Несколько команд в «Повтори» | Все команды из скобок идут в тело цикла |
| Лишняя линия между фигурами | Перед переездом up(), после него down() |
| Перепутали объединение и пересечение | Объединение: сумма минус общая часть. Пересечение: только общая часть |
Домашка
Шесть задач с настоящих экзаменов. Кнопка «Решать здесь» открывает редактор с шаблоном, а код каждой задачи сохраняется. Рисуем, читаем углы, считаем ручками.
Перед запуском реши, какие m и range подойдут. Посмотри на длины в условии: при сторонах около 70 подойдёт m = 5 и диапазон от −10 до 100.
Во второй и четвёртой задачах есть углы по 45°: смотри на рисунок, а не считай, что это прямоугольник. В последней задаче нечётное число повторов и команда «Назад».
Ещё задачи этого вида лежат в разделе «Задания», №6.
Примеры и задачи «Попробуй сам» учебные, в домашке задачи с настоящих экзаменов и из банка ФИПИ. На сайте код рисует упрощённая черепаха, команды шаблона работают как на экзамене.