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

Ис­пол­ни­тель Че­ре­па­ха пе­ре­дви­га­ет­ся по плос­ко­сти и остав­ля­ет след в виде линии. Че­ре­па­ха может вы­пол­нять три ко­ман­ды.

По ко­ман­де Вперёд n Че­ре­па­ха пе­ре­ме­ща­ет­ся вперёд на n еди­ниц.

По ко­ман­де На­пра­во m Че­ре­па­ха по­во­ра­чи­ва­ет­ся на месте на m гра­ду­сов по ча­со­вой стрел­ке, при этом со­от­вет­ствен­но ме­ня­ет­ся на­прав­ле­ние даль­ней­ше­го дви­же­ния.

По ко­ман­де На­ле­во m Че­ре­па­ха по­во­ра­чи­ва­ет­ся на месте на m гра­ду­сов про­тив ча­со­вой стрел­ки, при этом со­от­вет­ствен­но ме­ня­ет­ся на­прав­ле­ние даль­ней­ше­го дви­же­ния.

В на­чаль­ный мо­мент Че­ре­па­ха на­хо­дит­ся в на­ча­ле ко­ор­ди­нат и на­прав­ле­на вверх (вдоль по­ло­жи­тель­но­го на­прав­ле­ния оси ор­ди­нат), хвост опу­щен.

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

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

На­пра­во 315

По­вто­ри 7 [Вперёд 16 На­пра­во 45 Вперёд 8 На­пра­во 135].

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

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

Ре­ше­ние.

Вос­поль­зу­ем­ся сре­дой КуМир, по­стро­им фи­гу­ру.

По­счи­та­ем точки, на­хо­дя­щи­е­ся внут­ри фи­гу­ры. По­лу­чим 77.

 

Ответ: 77.

 

При­ведём ре­ше­ние Ев­ге­ния Дж­об­са на языке Python.

Вос­поль­зу­ем­ся биб­лио­те­кой turtle, пред­ва­ри­тель­но на­пра­вив го­ло­ву че­ре­па­хи вдоль оси ор­ди­нат. До­ба­вив две ко­ман­ды для быст­рой от­ри­сов­ки  — tracer(0) в на­ча­ло ал­го­рит­ма и update() в конец. Для боль­ше­го мас­шта­ба уве­ли­чим каж­дое пе­ре­ме­ще­ние в 10 раз. После чего на­не­сем точки с це­ло­чис­лен­ны­ми ко­ор­ди­на­та­ми. Так же не за­бу­дем уне­сти ко­ман­ду update() в конец ал­го­рит­ма.

 

from turtle import *

tracer(0)

left(90)

 

down()

right(315)

for _ in range(7):

forward(16*10)

right(45)

forward(8*10)

right(135)

for x in range(-15, 15):

for y in range(0, 25):

up()

goto(x*10, y*10)

down()

dot(3)

update()

 

При­ведём ре­ше­ние Ев­ге­ния Дж­об­са (ана­ли­ти­че­ское).

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

На­пра­во 315°

Впе­ред 16°

На­пра­во 45°

Впе­ред 8°

На­пра­во 135°

После пер­вой ите­ра­ции не на­хо­дим за­мкну­тую фи­гу­ру. По­это­му вы­пол­ня­ем ал­го­ритм для вто­рой ите­ра­ции.

Впе­ред 16°

На­пра­во 45°

Впе­ред 8°

На­пра­во 135°

За­ме­тим, что ис­пол­ни­тель вер­нул­ся в точку, от­ку­да на­ча­лась пер­вая ите­ра­ция. Сле­до­ва­тель­но, осталь­ные 5 ите­ра­ций будут про­сто по­вто­рять ри­су­нок по­верх уже на­ри­со­ван­но­го следа.

При вы­пол­не­нии ал­го­рит­ма стоит пом­нить те­ку­щие углы от­кло­не­ния. Так, на­при­мер, после пер­вой ко­ман­ды ис­пол­ни­тель будет от­кло­нен от оси Ox на 45 гра­ду­сов, при сле­ду­ю­щем по­во­ро­те от­кло­не­ние будет на 90 гра­ду­сов и так далее. Также из курса гео­мет­рии мы знаем, что линия, про­ве­ден­ная под углом 45 гра­ду­сов, на­чи­на­ю­ща­я­ся в точке (х, у) с це­ло­чис­лен­ны­ми ко­ор­ди­на­та­ми, про­хо­дит через все точки с ко­ор­ди­на­та­ми (x + k, y + k), где k  — целое число. Также мы можем под­счи­тать ко­ли­че­ство точек с це­ло­чис­лен­ны­ми ко­ор­ди­на­та­ми на пра­вой вер­ти­каль­ной сто­ро­не  — точек всего 9. Те­перь оста­лось найти ко­ли­че­ство вер­ти­каль­ных линий с шагом 1, ко­то­рые пе­ре­се­ка­ют фи­гу­ру. Для этого опре­де­лим её длину через вы­чис­ле­ния ка­те­тов рав­но­сто­рон­не­го пря­мо­уголь­но­го тре­уголь­ни­ка с ги­по­те­ну­зой дли­ной 16. Тогда:

16 в квад­ра­те =2 x в квад­ра­те рав­но­силь­но 128=x в квад­ра­те ,

от­ку­да x= ко­рень из: на­ча­ло ар­гу­мен­та: 128 конец ар­гу­мен­та \approx 11,3. Сле­до­ва­тель­но, ко­ли­че­ство точек внут­ри фи­гу­ры 7 · 11  =  77.

 

При­ведём ре­ше­ние Ильи Ан­дри­а­но­ва на языке Python.

import turtle as t

t.left(90)

l = 20

t.begin_fill()

t.right(315)

for i in range(2):

t.forward(16 * l)

t.right(45)

t.forward(8 * l)

t.right(135)

t.end_fill()

count = 0

canvas = t.getcanvas()

for x in range(-100*l, 100*l, l):

for y in range(-100*l, 100*l, l):

z = canvas.find_overlapping(x, y, x, y)

if len(z) == 1 and z[0] == 5:

count += 1

print(count)

t.done()

 

При­ведём ре­ше­ние Алек­сандра Коз­ло­ва на языке Python.

from turtle import *

rt(225)

m = 10

begin_fill()

for i in range(2):

fd(16*m)

rt(45)

fd(8*m)

rt(135)

end_fill()

canvas = getcanvas()

k = 0

for x in range(-20,20):

for y in range(-20,20):

if canvas.find_overlapping(x*m,y*m,x*m,y*m) == (5,):

k+=1

print('Ответ:',k)

 

При­ведём ре­ше­ние Сер­гея Донец на языке PascalABC.NET.

uses turtle;

begin

down;

TurnRight(315);

loop 7 do begin{По­вто­ри 7

[Вперёд 16 На­пра­во 45 Вперёд 8 На­пра­во 135].}

Forw(16);TurnRight(45);Forw(8);TurnRight(135);

end;

end.

Источник: ЕГЭ по ин­фор­ма­ти­ке 06.04.2023. До­сроч­ная волна