6 - Циклические алгоритмы для Исполнителя
Источники:
сайт Полякова (https://kpolyakov.spb.ru/)
демонстрационная версия станции КЕГЭ (https://kompege.ru/)
Источники:
сайт Полякова (https://kpolyakov.spb.ru/)
демонстрационная версия станции КЕГЭ (https://kompege.ru/)
1) (№ 13852 Е.Джобс) Исполнитель Кузнечик существует на числовой прямой. Кузнечик имеет три команды:
Вперед 5 – перемещает кузнечика на 5 единиц вперед,
Назад 3 – перемещает кузнечика на 3 единицы назад,
Перекрасить – закрашивает не закрашенную клетку или отменяет закраску закрашенной клетки, которая находится в точке, где в данный момент находится исполнитель.
Запись Повтори k раз Команды конец означает, что последовательность Команд повторится k раз.
Определите, сколько клеток будет закрашено после выполнения следующего алгоритма
Повторить 27 раз
Вперед 5
Перекрасить
Назад 3
Перекрасить
Назад 3
Конец
Решение
m=[0]*100
i=0
for p in range(27):
i+=5
m[i]=not(m[i])
i-=3
m[i]=not(m[i])
i-=3
print(sum(m))
Ответ: 6
2) (№ 13851 Е.Джобс) Исполнитель Кузнечик существует на числовой прямой. Кузнечик имеет три команды:
Вперед 2 – перемещает кузнечика на 2 единицы вперед,
Назад 4 – перемещает кузнечика на 4 единицы назад,
Закрасить – закрашивает клетку, которая находится в точке, где в данный момент находится исполнитель.
Запись Повтори k раз Команды конец означает, что последовательность Команд повторится k раз.
Определите, сколько клеток будет закрашено после выполнения следующего алгоритма
Повторить 11 раз
Вперед 2
Закрасить
Назад 4
Закрасить
Вперед 2
Вперед 2
Конец
Решение
m=[0]*100
i=0
for p in range(11):
i+=2
m[i]=1
i-=4
m[i]=1
i+=4
print(sum(m))
Ответ: 13
3) (№ 13848 Е.Джобс) Исполнитель Чертёжник перемещается на координатной плоскости, оставляя след в виде линии.
После выполнения команды «Поднять перо» чертежник перестает оставлять след и перемещается согласно приведенному алгоритму. После выполнения команды «Опустить перо» чертежник начинает оставлять след. В начальный момент перо опущено, то есть чертежник при перемещении будет оставлять след.
Чертёжник может выполнять команду Сместиться на (a,b) (где a, b — целые числа), перемещающую Чертёжника из точки с координатами (x, y) в точку с координатами (x+a, y+b). Если числа a, b положительные, то значение соответствующей координаты увеличивается, если отрицательные — уменьшается. При выполнении команды Сместиться в (x, y) чертежник перемещается в точку с координатами (х, у).
Запись Повтори k [Команда1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз.
Чертёжнику был дан для исполнения алгоритм:
Повтори 10 [
Сместиться на (60, 156)
Сместиться на (140, -153)
Сместиться в (71, 80)
Сместиться на (-111, 77)
]
Определите количество точек с целочисленными координатами, лежащих на оставленном чертежником следе.
Решение
def kac(x1,y1,x2,y2):
a=(y1-y2)/(x1-x2)
return a,y1-a*x1
def klen(x1,y1,x2,y2,r):
x,y=[x1,x2],[y1,y2]
if x1!=x2:
a,c=kac(x1,y1,x2,y2)
for xt in range(min(x),max(x)+1):
yt=a*xt+c
if yt==int(yt): m[xt+r//2][int(yt)+r//2]=1
else:
for yt in range(min(y),max(y)):m[x1+r//2][int(yt)+r//2]=1
r=1000
m=[[0]*r for i in range(r)]
x1=y1=0
for i in range(10):
x2,y2=x1+60,y1+156; klen(x1,y1,x2,y2,r); x1,y1=x2,y2
x2,y2=x1+140,y1-153; klen(x1,y1,x2,y2,r); x1,y1=x2,y2
x2,y2=71,80; klen(x1,y1,x2,y2,r); x1,y1=x2,y2
x2,y2=x1-111,y1+77; klen(x1,y1,x2,y2,r); x1,y1=x2,y2
k=0
for i in range(r):
k+=sum(m[i])
print(k)
Ответ: 29
4) (№ 13847 Е.Джобс) Исполнитель Чертёжник перемещается на координатной плоскости, оставляя след в виде линии.
После выполнения команды «Поднять перо» чертежник перестает оставлять след и перемещается согласно приведенному алгоритму. После выполнения команды «Опустить перо» чертежник начинает оставлять след. В начальный момент перо опущено, то есть чертежник при перемещении будет оставлять след.
Чертёжник может выполнять команду Сместиться на (a,b) (где a, b — целые числа), перемещающую Чертёжника из точки с координатами (x, y) в точку с координатами (x+a, y+b). Если числа a, b положительные, то значение соответствующей координаты увеличивается, если отрицательные — уменьшается. При выполнении команды Сместиться в (x, y) чертежник перемещается в точку с координатами (х, у).
Запись Повтори k [Команда1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз.
Чертёжнику был дан для исполнения алгоритм:
Повтори 10 [
Сместиться на (6, 15)
Сместиться на (4, -6)
Сместиться в (2, 2)
Сместиться на (3, 9)
]
Определите количество точек с целочисленными координатами, лежащих на оставленном чертежником следе.
Решение
def kac(x1,y1,x2,y2):
a=(y1-y2)/(x1-x2)
return a,y1-a*x1
def klen(x1,y1,x2,y2,r):
x,y=[x1,x2],[y1,y2]
if x1!=x2:
a,c=kac(x1,y1,x2,y2)
for xt in range(min(x),max(x)+1):
yt=a*xt+c
if yt==int(yt): m[xt+r//2][int(yt)+r//2]=1
else:
for yt in range(min(y),max(y)):m[x1+r//2][int(yt)+r//2]=1
r=100
m=[[0]*r for i in range(r)]
x1=y1=0
for i in range(10):
x2,y2=x1+6,y1+15; klen(x1,y1,x2,y2,r); x1,y1=x2,y2
x2,y2=x1+4,y1-6; klen(x1,y1,x2,y2,r); x1,y1=x2,y2
x2,y2=2,2; klen(x1,y1,x2,y2,r); x1,y1=x2,y2
x2,y2=x1+3,y1+9; klen(x1,y1,x2,y2,r); x1,y1=x2,y2
k=0
for i in range(r):
k+=sum(m[i])
print(k)
Ответ: 15
5) (№ 13846 Е.Джобс) Исполнитель Чертёжник перемещается на координатной плоскости, оставляя след в виде линии.
После выполнения команды «Поднять перо» чертежник перестает оставлять след и перемещается согласно приведенному алгоритму. После выполнения команды «Опустить перо» чертежник начинает оставлять след. В начальный момент перо опущено, то есть чертежник при перемещении будет оставлять след.
Чертёжник может выполнять команду Сместиться на (a,b) (где a, b — целые числа), перемещающую Чертёжника из точки с координатами (x, y) в точку с координатами (x+a, y+b). Если числа a, b положительные, то значение соответствующей координаты увеличивается, если отрицательные — уменьшается. При выполнении команды Сместиться в (x, y) чертежник перемещается в точку с координатами (х, у).
Запись Повтори k [Команда1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз.
Чертёжнику был дан для исполнения алгоритм:
Повтори 10 [Сместиться на (6, 15) Сместиться на (-5, -5) Сместиться в (2, 2) Сместиться на (-1, -10)]
Определите количество точек с целочисленными координатами, лежащих на оставленном чертежником следе.
Решение
def kac(x1,y1,x2,y2):
a=(y1-y2)/(x1-x2)
return a,y1-a*x1
def klen(x1,y1,x2,y2,r):
x,y=[x1,x2],[y1,y2]
if x1!=x2:
a,c=kac(x1,y1,x2,y2)
for xt in range(min(x),max(x)+1):
yt=a*xt+c
if yt==int(yt): m[xt+r//2][int(yt)+r//2]=1
else:
for yt in range(min(y),max(y)):m[x1+r//2][int(yt)+r//2]=1
r=100
m=[[0]*r for i in range(r)]
x1=y1=0
for i in range(10):
x2,y2=x1+6,y1+15; klen(x1,y1,x2,y2,r); x1,y1=x2,y2
x2,y2=x1-5,y1-5; klen(x1,y1,x2,y2,r); x1,y1=x2,y2
x2,y2=2,2; klen(x1,y1,x2,y2,r); x1,y1=x2,y2
x2,y2=x1-1,y1-10; klen(x1,y1,x2,y2,r); x1,y1=x2,y2
k=0
for i in range(r):
k+=sum(m[i])
print(k)
Ответ: 18
6) (№ 99999_вариация задания 13846) Исполнитель Чертёжник перемещается на координатной плоскости, оставляя след в виде линии.
После выполнения команды «Поднять перо» чертежник перестает оставлять след и перемещается согласно приведенному алгоритму. После выполнения команды «Опустить перо» чертежник начинает оставлять след. В начальный момент перо опущено, то есть чертежник при перемещении будет оставлять след.
Чертёжник может выполнять команду Сместиться на (a,b) (где a, b — целые числа), перемещающую Чертёжника из точки с координатами (x, y) в точку с координатами (x+a, y+b). Если числа a, b положительные, то значение соответствующей координаты увеличивается, если отрицательные — уменьшается. При выполнении команды Сместиться в (x, y) чертежник перемещается в точку с координатами (х, у).
Запись Повтори k [Команда1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз.
Чертёжнику был дан для исполнения алгоритм:
Повтори 10 [Сместиться на (2, 2) Сместиться на (0, 2) Сместиться в (4, 4) Сместиться на (0, -2)]
Определите количество точек с целочисленными координатами, лежащих на оставленном чертежником следе.
Решение
def kac(x1,y1,x2,y2):
a=(y1-y2)/(x1-x2)
return a,y1-a*x1
def klen(x1,y1,x2,y2,r):
x,y=[x1,x2],[y1,y2]
if x1!=x2:
a,c=kac(x1,y1,x2,y2)
for xt in range(min(x),max(x)+1):
yt=a*xt+c
if yt==int(yt): m[xt+r//2][int(yt)+r//2]=1
else:
for yt in range(min(y),max(y)):m[x1+r//2][int(yt)+r//2]=1
r=100
m=[[0]*r for i in range(r)]
x1=y1=0
for i in range(10):
x2,y2=x1+2,y1+2; klen(x1,y1,x2,y2,r); x1,y1=x2,y2
x2,y2=x1+0,y1+2; klen(x1,y1,x2,y2,r); x1,y1=x2,y2
x2,y2=4,4; klen(x1,y1,x2,y2,r); x1,y1=x2,y2
x2,y2=x1+0,y1-2; klen(x1,y1,x2,y2,r); x1,y1=x2,y2
k=0
for i in range(r):
k+=sum(m[i])
print(k)
Ответ: 14
7) (№ 6256 PRO100 ЕГЭ) Исполнитель Черепаха действует на плоскости с декартовой системой координат. В начальный момент Черепаха находится в начале координат, её голова направлена вдоль положительного направления оси ординат, хвост поднят. При опущенном хвосте Черепаха оставляет на поле след в виде линии. В каждый конкретный момент известно положение исполнителя и направление его движения. У исполнителя существует 6 команд: Поднять хвост, означающая переход к перемещению без рисования; Опустить хвост, означающая переход в режим рисования; Вперёд n (где n – целое число), вызывающая передвижение Черепахи на n единиц в том направлении, куда указывает её голова; Назад n (где n – целое число), вызывающая передвижение в противоположном голове направлении; Направо m (где m – целое число), вызывающая изменение направления движения на m градусов по часовой стрелке, Налево m (где m – целое число), вызывающая изменение направления движения на m градусов против часовой стрелки.
Запись
Повтори k [Команда1 Команда2 … КомандаS]
означает, что последовательность из S команд повторится k раз. Черепахе был дан для исполнения следующий алгоритм:
Повтори 2 [Вперёд 10 Направо 90 Вперёд 20 Направо 90]
Поднять хвост
Вперёд 4 Направо 90 Вперёд 3 Налево 90
Опустить хвост
Повтори 2 [Вперёд 70 Направо 90 Вперёд 80 Направо 90]
Определите минимальное расстояние от точки с координатами (0, 0) до следа, оставленного черепахой.
Решение
from turtle import *
m=10
lt(90)
dot()
pu()
for i in range(2): fd(10*m);rt(90);fd(20*m);rt(90)
pu()
fd(4*m);rt(90);fd(3*m);lt(90)
pd()
for i in range(2): fd(70*m);rt(90);fd(80*m);rt(90)
pu()
for x in range(10):
for y in range(10):
goto(x*m,y*m);dot()
Ответ: 5