Задания
Версия для печати и копирования в MS Word

Тек­сто­вый файл со­сто­ит не более чем из 106 сим­во­лов X, Y и Z. Опре­де­ли­те мак­си­маль­ную длину це­поч­ки вида XYZXYZXYZ... (со­став­лен­ной из фраг­мен­тов XYZ, по­след­ний фраг­мент может быть не­пол­ным).

Для вы­пол­не­ния этого за­да­ния сле­ду­ет на­пи­сать про­грам­му. Ниже при­ведён файл, ко­то­рый не­об­хо­ди­мо об­ра­бо­тать с по­мо­щью дан­но­го ал­го­рит­ма.

За­да­ние 24

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

Ре­ше­ние.

При­ведём ре­ше­ние Чур­ки­на Ни­ко­лая (Ти­ма­шевск) на языке Python.

f = open('24.txt').readline()

k = m = 0

for i in range(len(f)):

if (f[i] == 'X' and k%3 == 0) or (f[i] == 'Y' and k%3 == 1) or (f[i] == 'Z' and k%3 == 2):

k += 1

m = max(m, k)

elif f[i] == 'X': k = 1

else: k = 0

print(m)

 

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла в усло­вии по­лу­ча­ем ответ  — 13.

 

Ответ: 13.

 

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

import re

f = open('24_demo.txt').read()

r = re.findall(r'(?:XYZ)+(?:XY|X)?', f)

r = map(lambda x: len(x), r)

print(max(r))

 

При­ведём ре­ше­ние Фе­фе­ло­ва Сер­гея на языке Python.

f = open('24.txt').readline()

k = mx = 0

for i in range(len(f)):

if f[i-1:i+1] in 'XYZX' and k:

k += 1

elif f[i] == 'X':

k = 1

else:

k = 0

mx = max(mx, k)

print(mx)

 

При­ведём ре­ше­ние Пу­чен­ко Де­ни­са на языке Python.

f=open('24.txt').readline()

k = 1

while ('XYZ' * k) in f:

k = k + 1

R = 'XYZ'*(k - 1)

if (R + 'X') in f:

if (R + 'XY') in f: print(len(R + 'XY'))

else: print(len(R + 'X'))

else: print(len(R))

 

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

f = open("24_demo.txt")

s = f.read()

s1 = 'XYZ'

a = s.split(s1)

while len(a) > 1:

s2 = s1

s1 += 'XYZ'

a = s.split(s1)

if s2 + 'X' in s:

s2 += 'X'

if s2 + 'Y' in s:

s2 += 'Y'

print(len(s2))

 

При­ведём ре­ше­ние Дмит­рия Бур­ни­на на языке Python.

from re import *

s = open('24_demo.txt').readline()

reg = r'(?=((XYZ)+((XY)*|X*)*))'

print(max(([len(x.group(1)) for x in finditer(reg,s)])))

 

При­ведём ре­ше­ние Ро­ма­на Ша­ти­ло на языке Python.

s = open('24_demo.txt').readline()

s = s.replace('XYZ','***')

s = s.replace('*X','*+').replace('+Y','*+')

s = s.replace('+','+ ')

s = s.replace('X',' ').replace('Y',' ').replace('Z',' ')

print(max(len(x) for x in s.split()))

 

При­ведём дру­гое ре­ше­ние дан­ной за­да­чи на языке Pascal.

Для ре­ше­ния дан­ной за­да­чи будем по­сим­воль­но счи­ты­вать тек­сто­вый файл. Объ­явим пе­ре­мен­ные: s  — стро­ка для ра­бо­ты с сим­во­ла­ми из файла, maxCount  — мак­си­маль­ная длина по­сле­до­ва­тель­но­сти, count  — вре­мен­ное хра­не­ние длины по­сле­до­ва­тель­но­сти, i  — пе­ре­мен­ная для пе­ре­бо­ра всех сим­во­лов. Ал­го­ритм будет срав­ни­вать зна­че­ния на трех по­зи­ци­ях, если сим­во­лы будут удо­вле­тво­рять нуж­ным усло­ви­ям, то зна­че­ние счет­чи­ка будет уве­ли­чи­вать­ся на 1.

 

При­ведём ре­ше­ние дан­ной за­да­чи на языке Pascal.

begin

var s: string;

var i, count, maxCount: integer;

assign(input, '24.txt');

readln(s);

count:=0;

maxCount:=0;

for i:=1 to Length(s) do

if ((s[i]='X') and (count mod 3=0)) or

((s[i]='Y') and (count mod 3=1)) or

((s[i]='Z') and (count mod 3=2)) then begin

count := count+1;

if count > maxCount then

maxCount := count;

end

else if s[i]='X' then count:=1

else count := 0;

 

writeln(maxCount);

end.

Раздел кодификатора ФИПИ: