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

Ис­пол­ни­тель Ре­дак­тор по­лу­ча­ет на вход стро­ку цифр и пре­об­ра­зу­ет её. Ре­дак­тор может вы­пол­нять две ко­ман­ды, в обеих ко­ман­дах v и w обо­зна­ча­ют це­поч­ки цифр.

А)  за­ме­нить (v, w).

Эта ко­ман­да за­ме­ня­ет в стро­ке пер­вое слева вхож­де­ние це­поч­ки v на це­поч­ку w. На­при­мер, вы­пол­не­ние ко­ман­ды за­ме­нить (111, 27) пре­об­ра­зу­ет стро­ку 05111150 в стро­ку 0527150.

Если в стро­ке нет вхож­де­ний це­поч­ки v, то вы­пол­не­ние ко­ман­ды за­ме­нить (v, w) не ме­ня­ет эту стро­ку.

Б)  на­шлось (v).

Эта ко­ман­да про­ве­ря­ет, встре­ча­ет­ся ли це­поч­ка v в стро­ке ис­пол­ни­те­ля Ре­дак­тор. Если она встре­ча­ет­ся, то ко­ман­да воз­вра­ща­ет ло­ги­че­ское зна­че­ние «ис­ти­на», в про­тив­ном слу­чае воз­вра­ща­ет зна­че­ние «ложь». Стро­ка ис­пол­ни­те­ля при этом не из­ме­ня­ет­ся.

 

Дана про­грам­ма для Ре­дак­то­ра:

НА­ЧА­ЛО

                ПОКА НЕ на­шлось (00)

                        за­ме­нить (02, 101)

                        за­ме­нить (11, 2)

                        за­ме­нить (012, 30)

                        за­ме­нить (010, 00)

                КОНЕЦ ПОКА

КОНЕЦ

 

Из­вест­но, что ис­ход­ная стро­ка A со­дер­жа­ла ровно два нуля  — на пер­вом и на по­след­нем месте, 48 еди­ниц, боль­ше 48 двоек и не со­дер­жа­ла дру­гих цифр. После вы­пол­не­ния дан­ной про­грам­мы по­лу­чи­лась стро­ка B, сумма цифр ко­то­рой ока­за­лась про­стым чис­лом. Какое наи­мень­шее ко­ли­че­ство двоек могло быть в стро­ке A?

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

Ре­ше­ние.

За­ме­тим, что строч­ки:

за­ме­нить (02, 101)

за­ме­нить (11, 2)

за­ме­нить (012, 30)

не ме­ня­ют сумму чисел в стро­ке, а строч­ка:

за­ме­нить (010, 00)

будет вы­пол­не­на один раз и умень­шит ито­го­вую сумму на 1. Со­ста­вим про­грам­му, ко­то­рая счи­та­ет сумму стро­ки и про­ве­ря­ет, что сумма  — про­стое число.

 

При­ве­дем ре­ше­ние на языке Python.

def Div(n):

for i in range(2, int(n ** 0.5) + 1):

if n % i == 0:

return 0

return n > 1

 

for n in range(49,100):

s = 48 * 1 + n * 2 - 1

if Div(s):

print(n)

break

 

Ответ: 51.

 

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

def prostoe(n):

k=2

while k**2<=n:

if n%k==0: return False

k+=1

return True

 

def algo(s):

while not '00' in s:

s=s.replace('02','101',1)

s=s.replace('11','2',1)

s=s.replace('012','30',1)

s=s.replace('010','00',1)

return sum(map(int,s))

 

for n in range(49,100):

s='0'+'2'*n+'1'*48+'0'

if prostoe(algo(s)):

print(n)

break


Аналоги к заданию № 58479: 58520 Все