Программное решение задач ЕГЭ по информатике

Задача 6903. Источник: Поляков. Задание КИМ 24

Страница задачи 6903

(П. Финкель) Текстовый файл 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

Отправить замечание по решению

Код по которому имеется замечание:

Ваш вариант кода:

Комментарий: