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

Тек­сто­вый файл со­дер­жит стро­ки раз­лич­ной длины. Общий объём файла не пре­вы­ша­ет 1 Мбайт. Стро­ки со­дер­жат толь­ко за­глав­ные буквы ла­тин­ско­го ал­фа­ви­та (ABCZ).

В стро­ках, со­дер­жа­щих менее 25 букв A, нужно опре­де­лить и вы­ве­сти мак­си­маль­ное рас­сто­я­ние между оди­на­ко­вы­ми бук­ва­ми в одной стро­ке.

При­мер. Ис­ход­ный файл:

GIGA

GABLAB

NOTEBOOK

AGAAA

В этом при­ме­ре во всех стро­ках мень­ше 25 букв A. Самое боль­шое рас­сто­я­ние между оди­на­ко­вы­ми бук­ва­ми  — в тре­тьей стро­ке между бук­ва­ми O, рас­по­ло­жен­ны­ми в стро­ке на 2-⁠й и 7-⁠й по­зи­ци­ях. В от­ве­те для дан­но­го при­ме­ра нужно вы­ве­сти число 5.

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

За­да­ние 24

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

Ре­ше­ние.

Будем по­сле­до­ва­тель­но счи­ты­вать стро­ки из файла. В каж­дой счи­тан­ной стро­ке будем счи­тать ко­ли­че­ство букв A и за­пи­сы­вать это ко­ли­че­ство в счётчик count. Если ко­ли­че­ство букв A в стро­ке будет мень­ше 25, будем счи­тать рас­сто­я­ние между оди­на­ко­вы­ми бук­ва­ми в стро­ке. Для этого для каж­дой буквы ал­фа­ви­та с по­мо­щью ме­то­да LastIndexOf() будем на­хо­дить по­след­нюю по­зи­цию буквы в стро­ке, а с по­мо­щью ме­то­да IndexOf() будем на­хо­дить первую по­зи­цию буквы в стро­ке. Вы­чис­лив раз­ность между по­след­ней и пер­вой по­зи­ци­я­ми, будем срав­ни­вать по­лу­чен­ный ре­зуль­тат с пе­ре­мен­ной max. Если ре­зуль­тат будет боль­ше те­ку­ще­го зна­че­ния пе­ре­мен­ной max, то будем при­сва­и­вать пе­ре­мен­ной max зна­че­ние вы­чис­лен­ной раз­но­сти.

 

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

var

i, count, max, submax: integer;

j: char;

s: string;

f: text;

begin

assign(f,'C:\inf_26_04_21_24.txt');

reset(f);

s := '';

max := 0;

while not eof(f) do begin

count := 0;

readln(f, s);

for i := 1 to s.Length do begin

if s[i] = 'A' then count := count + 1;

end;

if count < 25 then

for j := 'A' to 'Z' do begin

submax := s.LastIndexOf(j) - s.IndexOf(j);

if submax > max then max := submax;

end;

end;

writeln(max);

end.

 

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

 

Ответ: 1004.

 

При­ме­ча­ние. Путь к файлу не­об­хо­ди­мо ука­зать со­глас­но рас­по­ло­же­нию файла на Вашем ком­пью­те­ре.

 

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

with open("inf_26_04_21_24.txt") as f:

p = f.readlines()

maxx = 0

a = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]

for j in p:

for i in a:

if j.rfind(i) - j.find(i) > maxx and j.count("A") < 25:

maxx = j.rfind(i) - j.find(i)

print(maxx)

 

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

f=open('inf_26_04_21_24.txt')

rr=0

for x in f:

s=f.readline()

m=[]

r=0

ss=int(len(s))

for x in range (ss+1):

for y in range(ss-1,x,-1):

if s[x]==s[y] and s.count('A')<25:

r=max(r,y-x)

break

rr=max(rr,r)

print(rr)

 

При­ведём дру­гое ре­ше­ние Кар­пен­ко Та­тья­ны на языке Python.

lines = open('inf_26_04_21_24.txt').readlines()

max_distance = 0

for line in lines:

if line.count('A') < 25:

for s in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':

max_distance = max(line.rindex(s) - line.index(s), max_distance)

print(max_distance)

 

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

f=open('inf_26_04_21_24.txt').readlines()

mx = 0

for a in f:

if a.count('A') < 25:

m =0

for i in range(len(a)):

if a.count(a[i]) > 1:

r = a.rfind(a[i]) -a.find(a[i])

m = max(m,r)

mx = max(mx,m)

print(mx)

 

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

print(max([max([line.rfind(c) - line.find(c) for c in set(line)]) for line in open('inf_26_04_21_24.txt', 'r') if line.count('A') < 25]))


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

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