Задание №6 — Анализ алгоритмов для исполнителя
Исполнитель Черепаха действует на плоскости с декартовой системой координат. В начальный момент Черепаха находится в начале координат, её голова направлена вдоль положительного направления оси ординат, хвост опущен. При опущенном хвосте Черепаха оставляет на поле след в виде линии. В каждый конкретный момент известно положение исполнителя и направление его движения. У исполнителя существует две команды: Вперёд n (где n – целое число), вызывающая передвижение Черепахи на n единиц в том направлении, куда указывает её голова, и Направо m (где m – целое число), вызывающая изменение направления движения на m градусов по часовой стрелке.
Запись Повтори k [Команда1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз (k – целое число).
Черепахе был дан для исполнения следующий алгоритм:
Направо 270
Повтори 2 [Вперёд 8 Направо 120]
Направо 120
Повтори 2 [Направо 120 Вперёд 3 Направо 240]
Направо 240
Повтори 2 [Вперёд 14 Направо 120].
Определите, сколько точек с целочисленными координатами будут находиться внутри области, ограниченной линией, заданной данным алгоритмом. Точки на линии учитывать не следует.
Правильный ответ
78
Пояснение
Решение:
Сначала выясним, какую фигуру чертит алгоритм. Команда «Направо 270» из положения «голова вверх» разворачивает Черепаху влево, в сторону отрицательных . Первый цикл рисует отрезок из в , а после поворота на 120° — отрезок длиной 8 под углом 60° к оси абсцисс. Следующий блок дважды добавляет по 3 единицы в том же самом направлении, так что наклонный отрезок продолжается до общей длины и обрывается в точке . Последний цикл чертит отрезок 14 вниз-вправо в точку и отрезок 14 влево, замыкая контур в .
Итак, линия ограничивает равносторонний треугольник со стороной 14: основание лежит на оси абсцисс от до , вершина — , причём . Боковые стороны задаются уравнениями и , поэтому для каждого целого от 1 до 12 достаточно посчитать целые строго между этими границами.
По строкам получается 13, 11, 11, 9, 9, 7, 5, 5, 3, 3, 1 и 1 точка, а всего . Узлы на самой линии (в том числе 15 точек на основании) не учитываются.
from math import sqrt
n = 0
for y in range(1, 13):
left = -8 + y / sqrt(3) # левая сторона
right = 6 - y / sqrt(3) # правая сторона
for x in range(-8, 7):
if left < x < right:
n += 1
print(n) # 78
Ответ: 78