Задача 6905. Источник: Поляков. Задание КИМ 24
(П. Финкель) Текстовый файл 24-278.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита и десятичные цифры. Определите максимальную длину последовательности из букв {K, N, L, F} в любом порядке, которая ограничена по краям одинаковыми чётными цифрами.
Решение
Наиболее короткое решение на Python заключается в разделении исходной строки по каждой четной цифре, выделении из получившихся подстрок тех, которые содержат только указанные символы, получение длины каждой строки и выбор из этих значений максимального.
Python короткое решение
s = open('24-278.txt').readline()
mx = 0
for i in '02468':
mx = max(mx, *[len(x) for x in s.split(i) if len(set(x) - set('KNLF')) == 0])
print(mx)
Решение можно еще больше сократить и написать в одну строку, если использовать сложное списочное выражение.
Python короткое решение в одну строку
print(max([len(s) for i in '02468' for s in open('24-278.txt').readline().split(i) if len(set(s) - set('KNLF')) == 0]))
Универсальное решение, которое можно реализовать на любом языке программирования заключается в посимвольном просмотре строки. В цикле подсчитываем длину непрерывной цепочки из указанных символов. Встретив четную цифру, сравниваем ее с предыдущей встреченной четной цифрой перед непрерывной цепочкой. Если они совпадают, сравниваем длину получившейся цепочки с максимальной.
Python универсальное решение
s = open('24-278.txt').readline()
k = 0
mx = 0
last = ''
for i in s:
if i in '02468':
if i == last:
mx = max(mx, k)
k = 0;
last = i
elif i in 'KNLF':
k+= 1
else:
k = 0
last = ''
print(mx)
PascalABC универсальное решение
var
k, max, i: Integer;
s: String;
last: Char;
f: TEXT;
begin
Assign(f, '24-278.txt');
Reset(f);
Readln(f, s);
k := 0;
max := 0;
last := ' ';
for i := 1 to s.Length do
begin
if '02468'.IndexOf(s[i]) <> -1 then
begin
if (s[i] = last) and (k > max) then
max := k;
k := 0;
last := s[i];
end
else if 'KNLF'.IndexOf(s[i]) <> -1 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-278.txt");
string s;
f >> s;
int k = 0, max = 0;
string s1 = "02468", s2 = "KNLF";
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 (s2.find(s[i]) != -1)
k++;
else
{
k = 0;
last = ' ';
}
}
cout << max << endl;
}
Ответ
5103