Задание №6 — Анализ алгоритмов для исполнителя
Исполнитель Черепаха действует на плоскости с декартовой системой координат. В начальный момент Черепаха находится в начале координат, её голова направлена вдоль положительного направления оси ординат, хвост опущен. При опущенном хвосте Черепаха оставляет на поле след в виде линии. В каждый конкретный момент известно положение исполнителя и направление его движения. У исполнителя существует две команды: Вперёд n (где n – целое число), вызывающая передвижение Черепахи на n единиц в том направлении, куда указывает её голова; Направо m (где m – целое число), вызывающая изменение направления движения на m градусов по часовой стрелке.
Запись Повтори k [Команда1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз (где k – целое число).
Черепахе был дан для исполнения следующий алгоритм:
Направо 30 Повтори 7 [Направо 150 Вперёд 7 Направо 30 Вперёд 15].
Определите, сколько точек с целочисленными координатами будут находиться внутри области, которая ограничена линией, заданной алгоритмом. Точки на линии учитывать не следует.
Правильный ответ
49
Пояснение
Решение:
За один проход тела цикла Черепаха поворачивает на , поэтому линия замыкается уже за два прохода, а остальные повторения обводят ту же фигуру. Стороны идут в порядке 7, 15, 7, 15, значит нарисован параллелограмм со сторонами 7 и 15 и углами и .
Проследим за движением. После «Направо 30» и «Направо 150» голова смотрит вниз, отрезок длины 7 ведёт из в . Поворот на и отрезок длины 15 дают вершину , затем сторона длины 7 поднимает Черепаху в , и последняя сторона возвращает её в начало координат.
Значит, две стороны параллелограмма вертикальны и имеют длину 7 — они лежат на прямых и , а две наклонные стороны лежат на прямых и .
Точки на линиях не учитываем, поэтому , то есть принимает 7 целых значений: от до . При каждом таком нужно . Это интервал длины ровно 7 с иррациональными концами, поэтому целых точек в нём всегда ровно 7. Итого точек. Контроль: площадь параллелограмма равна .
from math import sqrt
total = 0
for x in range(-7, 0):
lo, hi = sqrt(3) * x - 7, sqrt(3) * x
total += len([y for y in range(-30, 5) if lo < y < hi])
print(total) # 49
Ответ: 49