Задания
Версия для печати и копирования в MS Word
Тип 6 № 58245
i

Ис­пол­ни­тель Че­ре­па­ха дей­ству­ет на плос­ко­сти с де­кар­то­вой си­сте­мой ко­ор­ди­нат. В на­чаль­ный мо­мент Че­ре­па­ха на­хо­дит­ся в на­ча­ле ко­ор­ди­нат, её го­ло­ва на­прав­ле­на вдоль по­ло­жи­тель­но­го на­прав­ле­ния оси ор­ди­нат, хвост опу­щен. При опу­щен­ном хво­сте Че­ре­па­ха остав­ля­ет на поле след в виде линии. В каж­дый кон­крет­ный мо­мент из­вест­но по­ло­же­ние ис­пол­ни­те­ля и на­прав­ле­ние его дви­же­ния. У ис­пол­ни­те­ля су­ще­ству­ет две ко­ман­ды: Вперёд r (где r  — ра­ци­о­наль­ное число), вы­зы­ва­ю­щая пе­ре­дви­же­ние Че­ре­па­хи на рас­сто­я­ние, рав­ное r, в том на­прав­ле­нии, куда ука­зы­ва­ет её го­ло­ва; На­пра­во m (где m  — целое число), вы­зы­ва­ю­щая из­ме­не­ние на­прав­ле­ния дви­же­ния на m гра­ду­сов по ча­со­вой стрел­ке.

За­пись По­вто­ри k [Ко­ман­да 1 Ко­ман­да 2 ... Ко­ман­да S] озна­ча­ет, что по­сле­до­ва­тель­ность из S ко­манд по­вто­рит­ся k раз.

Че­ре­па­хе был дан для ис­пол­не­ния сле­ду­ю­щий ал­го­ритм:

На­пра­во 60 По­вто­ри 2 [Вперёд 10 На­пра­во 120 Вперёд 5 На­пра­во 240] На­пра­во 120 Вперёд 3 На­пра­во 90 Вперёд 20 ко­рень из: на­ча­ло ар­гу­мен­та: 3 конец ар­гу­мен­та На­пра­во 90 Вперёд 8 На­пра­во 120 По­вто­ри 2 [Вперёд 10 На­ле­во 120 Вперёд 5 На­ле­во 240].

Опре­де­ли­те, сколь­ко точек с це­ло­чис­лен­ны­ми ко­ор­ди­на­та­ми будут на­хо­дить­ся внут­ри об­ла­сти, огра­ни­чен­ной линии, за­дан­ной дан­ным ал­го­рит­мом. Точки на линии учи­ты­вать не сле­ду­ет.

Спрятать решение

Ре­ше­ние.

Для ре­ше­ния будем ис­поль­зо­вать среду про­грам­ми­ро­ва­ния КуМир. Уста­но­вить зна­че­ние сетки 1.

При­ве­дем под­счет ко­ли­че­ства точек на языке Кумир.

ис­поль­зо­вать Че­ре­па­ха

алг

нач

опу­стить хвост

впра­во(60)

нц 2 раз

впе­ред(10)

впра­во(120)

впе­ред(5)

впра­во(240)

кц

впра­во(120)

впе­ред(3)

впра­во(90)

впе­ред(20*3**0.5)

впра­во(90)

впе­ред(8)

впра­во(120)

нц 2 раз

впе­ред(10)

влево(120)

впе­ред(5)

влево(240)

кц

кон

 

После вы­пол­не­ния про­грам­мы счи­та­ем точки: 174.

 

Ответ: 174.

 

При­ве­дем ре­ше­ние Сер­гея Стре­лю­хи­на (Са­ра­тов) на языке Python.

from turtle import *; from math import acos, pi, sqrt

k = 20; home(); begin_poly(); right(60)

for i in range(2):fd(10*k); right(120); fd(5*k); right(240)

right(120); fd(3*k); right(90); fd(20*sqrt(3)*k); right(90); fd(8*k); right(120)

for i in range(2):fd(10*k); left(120); fd(5*k); left(240)

end_poly(); t = [(round(i[0],2),round(i[1],2)) for i in get_poly()[:-1]]

ln = lambda x1,y1,x2,y2,X,X1,X2,Y,Y1,Y2: x1*y2-x2*y1==0 and (X1>=X>=X2 or X2>=X>=X1) and (Y1>=Y>=Y2 or Y2>=Y>=Y1)

def f(x1,y1,x2,y2):

a = acos((x1*x2+y1*y2)/(sqrt(x1*x1+y1*y1)*sqrt(x2*x2+y2*y2)))

return a*180/pi if (y1*x2-x1*y2)>0 else -(a*180/pi)

otv = ['line' if 1 in [ln((m[0]-n[0]),(m[1]-n[1]),(x*k-n[0]),(y*k-n[1]),x*k,n[0],m[0],y*k,n[1],m[1]) for n, m in zip(t,t[1:])]

else 361>sum([f((n[0]-x*k),(n[1]-y*k),(m[0]-x*k),(m[1]-y*k)) for n, m in zip(t,t[1:])])>359

for x in range(-100,100) for y in range(-100,100)]

print(otv.count('line'), otv.count(1)) # 36 - линия; 174 - в кон­ту­ре

 

# Рас­ста­вим точки для на­гляд­но­сти

pu()

for x in range(-7,7):

for y in range(-20,20):

setpos(x*k,y*k)

if 1 in [ln((m[0]-n[0]),(m[1]-n[1]),(x*k-n[0]),(y*k-n[1]),x*k,n[0],m[0],y*k,n[1],m[1]) for n, m in zip(t,t[1:])]:

dot(3, 'red')

elif 361>sum([f((n[0]-x*k),(n[1]-y*k),(m[0]-x*k),(m[1]-y*k)) for n, m in zip(t,t[1:])])>359:

dot(3,'green')

 

При­ве­дем ри­су­нок Сне­жа­ны Ва­си­лье­вой на языке Python.

from turtle import*

tracer(0)

screensize(2000,2000)

m=20

lt(90)

rt(60)

for i in range(2):

fd(10*m)

rt(120)

fd(5*m)

rt(240)

for i in range(1):

rt(120)

fd(3*m)

rt(90)

fd((20*3**0.5)*m)

rt(90)

fd(8*m)

rt(120)

for i in range(2):

fd(10*m)

lt(120)

fd(5*m)

lt(240)

up()

for x in range(-60,60):

for y in range(-60,60):

goto(x*m,y*m)

dot(5)

done()