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

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

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

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

GIGA

GABLAB

NOTEBOOK

AGAAA

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

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

За­да­ние 24

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

Ре­ше­ние.

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

 

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

var

i, count, max, submax: integer;

j: char;

s: string;

c: array['A'..'Z'] of integer;

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] = 'G' 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.

 

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

 

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

f = open('24.txt')

a = [x for x in f.readlines()]

max_s = 0

for i in range(len(a)):

if a[i].count('G') < 25:

for j in range(len(a[i])-1):

for q in range(j+1, len(a[i])):

if a[i][j] == a[i][q]:

if abs(j - q) > max_s:

max_s = abs(j - q)

print(max_s)

 

Ответ: 1001.

 

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

 

При­ведём ре­ше­ние Марка Све­жен­це­ва (Но­во­си­бирск) на языке Python.

with open('24.txt') as f:

s = f.readlines()

maxi = 0

for i in range(len(s)):

if s[i].count('G') < 25:

for j in s[i]:

if s[i].rfind(j) - s[i].find(j):

maxi = max(maxi, s[i].rfind(j) - s[i].find(j))

print(maxi)

 

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

with open('inf_26_04_21_24.txt', encoding='utf-8') as txt_file:

indent = 0

for line in txt_file:

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

my_set = set(line)

for char in my_set:

start = line.find(char) + 1

end = line.rfind(char) + 1

if indent < end - start:

indent = end - start

print(indent)

 

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

def mras(s):

return max([s.rfind(c)-s.find(c) for c in set(s)])

a = [s for s in open('inf_26_04_21_24.txt') if s.count('G') < 25]

print(max([mras(s) for s in a]))

 

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

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

maxi=0

for i in range (0,len(f)):

if f[i].count('G')<25:

for j in range (0,len(f[i])):

maxi=max(f[i].rindex(f[i][j])-j,maxi)

print(maxi)


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

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