Задача 6903. Источник: Поляков. Задание КИМ 24
(П. Финкель) Текстовый файл 24-276.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита и десятичные цифры. Определите максимальную длину последовательности букв F, которая ограничена по краям одинаковыми нечётными цифрами.
Решение
Компактное решение на Python требует хорошего знания возможностей языка. Разделим исходную строку по каждой нечетной цифре. Из получившихся подстрок оставим только состоящие из букв F, а затем из длин этих строк найдем максимальную.
Python короткое решение
s = open('24-276.txt').readline()
mx = 0
for i in '13579':
mx = max(mx, *[len(x) for x in s.split(i) if x.count("F") == len(x)])
print(mx)
Возможно написание однострочного решения, которое будет еще короче. Для этого нужно будет использовать сложное списочное выражение.
Python короткое решение в одну строку
print(max([len(s) for i in '13579' for s in open('24-276.txt').readline().split(i) if s.count("F") == len(s)]))
Более универсальным решением является посимвольная обработка строки. Подсчитываем количество идущих подряд букв F после встреченной нечетной цифры. Встретив следующую нечетную цифру, сравниваем ее с предыдущей. Если они совпали, сравниваем длину найденной цепочки с максимальной.
Python универсальное решение
s = open('24-276.txt').readline()
k = 0
mx = 0
last = ''
for i in s:
if i in '13579':
if i == last:
mx = max(mx, k)
k = 0;
last = i
elif i =='F':
k+= 1
else:
k = 0
last = ''
print(mx)
PascalABC универсальное решение
var
k, max, i: Integer;
s: String;
last: Char;
f: TEXT;
begin
Assign(f, '24-276.txt');
Reset(f);
Readln(f, s);
k := 0;
max := 0;
last := ' ';
for i := 1 to s.Length do
begin
if '13579'.IndexOf(s[i]) <> -1 then
begin
if (s[i] = last) and (k > max) then
max := k;
k := 0;
last := s[i];
end
else if s[i] = 'F' then
k := k + 1
else
begin
k := 0;
last := ' ';
end;
end;
Writeln(max);
end.
C++ универсальное решение
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream f;
f.open("24-276.txt");
string s;
f >> s;
int k = 0, max = 0;
string s1 = "13579";
char last = ' ';
for (int i = 0; i < s.length(); i++)
{
if (s1.find(s[i]) != -1)
{
if (s[i] == last && k > max)
max = k;
k = 0;
last = s[i];
}
else if (s[i] == 'F')
k++;
else
{
k = 0;
last = ' ';
}
}
cout << max << endl;
}
Ответ
468