Задание 6 ЕГЭ: циклические алгоритмы для исполнителя
Начало координат не в углу, а в центре окна — там, где Черепаха стоит вначале; x растёт вправо, y вверх. Поэтому «нижняя» граница рамки — это наименьший y. Черепаха чертит прямоугольник, поднимает хвост, переходит и чертит второй; спрашивают целые точки внутри пересечения, включая границу. В своей задаче меняются только числа и последняя строка:
from turtle import *
mnx = 0 # рамка: границы
mxx = 0 # фигуры по x и y
mny = 0
mxy = 0
def sbros(): # начать рамку
global mnx, mxx, mny, mxy
mnx = round(xcor())
mxx = mnx
mny = round(ycor())
mxy = mny
def metka(): # растянуть рамку
global mnx, mxx, mny, mxy
x = round(xcor())
y = round(ycor())
mnx = min(mnx, x)
mxx = max(mxx, x)
mny = min(mny, y)
mxy = max(mxy, y)
speed(0)
setheading(90) # Черепаха — вверх
# первая фигура: 24 и 30, шесть раз
sbros() # рамка с нуля
for i in range(6):
forward(24)
metka() # угол отмечен
right(90)
forward(30)
metka()
right(90)
ax1 = mnx # рамка первой
ax2 = mxx # фигуры готова
ay1 = mny
ay2 = mxy
penup() # переход: следа
forward(2) # нет, и в рамку
right(90) # он не входит
forward(10)
left(90)
pendown()
# вторая фигура: 75 и 71, тоже 6 раз
sbros() # рамка заново
for i in range(6):
forward(75)
metka()
right(90)
forward(71)
metka()
right(90)
bx1 = mnx # рамка второй
bx2 = mxx # фигуры
by1 = mny
by2 = mxy
# общая часть начинается там, где
# начались обе фигуры, и кончается
# там, где кончилась первая из них
lx = max(ax1, bx1) # левая граница
rx = min(ax2, bx2) # правая
ny = max(ay1, by1) # нижняя
vy = min(ay2, by2) # верхняя
# точек на одну больше, чем длина
print((rx - lx + 1) * (vy - ny + 1))
done()
sbros() — перед каждой фигурой, metka() — после
каждого forward и backward. round
нужен потому, что turtle считает через синусы и вместо 30 бывает
29.999999999999996. Эта программа печатает 483.
| Спрашивают | Что писать |
|---|---|
| целые точки, с границей | (rx - lx + 1) * (vy - ny + 1) |
| площадь | (rx - lx) * (vy - ny) |
| периметр | 2 * ((rx - lx) + (vy - ny)) |
| точки без границы | (rx - lx - 1) * (vy - ny - 1) |
| объединение | посчитать обе фигуры и вычесть пересечение: a + b - c |
Точек по оси всегда на одну больше, чем длина: от 0 до 3 — это четыре точки, а длина три. Отсюда и «плюс один».
Задание 6 ЕГЭ: циклические алгоритмы для исполнителя
Начало координат не в углу, а в центре окна — там, где Черепаха стоит вначале; x растёт вправо, y вверх. Поэтому «нижняя» граница рамки — это наименьший y. Черепаха чертит прямоугольник, поднимает хвост, переходит и чертит второй; спрашивают целые точки внутри пересечения, включая границу. В своей задаче меняются только числа и последняя строка:
from turtle import *
mnx = 0 # рамка: границы
mxx = 0 # фигуры по x и y
mny = 0
mxy = 0
def sbros(): # начать рамку
global mnx, mxx, mny, mxy
mnx = round(xcor())
mxx = mnx
mny = round(ycor())
mxy = mny
def metka(): # растянуть рамку
global mnx, mxx, mny, mxy
x = round(xcor())
y = round(ycor())
mnx = min(mnx, x)
mxx = max(mxx, x)
mny = min(mny, y)
mxy = max(mxy, y)
speed(0)
setheading(90) # Черепаха — вверх
# первая фигура: 24 и 30, шесть раз
sbros() # рамка с нуля
for i in range(6):
forward(24)
metka() # угол отмечен
right(90)
forward(30)
metka()
right(90)
ax1 = mnx # рамка первой
ax2 = mxx # фигуры готова
ay1 = mny
ay2 = mxy
penup() # переход: следа
forward(2) # нет, и в рамку
right(90) # он не входит
forward(10)
left(90)
pendown()
# вторая фигура: 75 и 71, тоже 6 раз
sbros() # рамка заново
for i in range(6):
forward(75)
metka()
right(90)
forward(71)
metka()
right(90)
bx1 = mnx # рамка второй
bx2 = mxx # фигуры
by1 = mny
by2 = mxy
# общая часть начинается там, где
# начались обе фигуры, и кончается
# там, где кончилась первая из них
lx = max(ax1, bx1) # левая граница
rx = min(ax2, bx2) # правая
ny = max(ay1, by1) # нижняя
vy = min(ay2, by2) # верхняя
# точек на одну больше, чем длина
print((rx - lx + 1) * (vy - ny + 1))
done()
sbros() — перед каждой фигурой, metka() — после
каждого forward и backward. round
нужен потому, что turtle считает через синусы и вместо 30 бывает
29.999999999999996. Эта программа печатает 483.
| Спрашивают | Что писать |
|---|---|
| целые точки, с границей | (rx - lx + 1) * (vy - ny + 1) |
| площадь | (rx - lx) * (vy - ny) |
| периметр | 2 * ((rx - lx) + (vy - ny)) |
| точки без границы | (rx - lx - 1) * (vy - ny - 1) |
| объединение | посчитать обе фигуры и вычесть пересечение: a + b - c |
Точек по оси всегда на одну больше, чем длина: от 0 до 3 — это четыре точки, а длина три. Отсюда и «плюс один».