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

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

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

(П. Финкель) Текстовый файл 24-277.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита и десятичные цифры. Определите максимальную длину последовательности гласных букв, которая ограничена по краям одинаковыми нечётными цифрами.

Решение

Возможности языка Python позволяют создать очень короткое решение. Разделим строку из файла по каждой нечетной цифре. Отфильтруем строки, содержащие только гласные буквы и найдем длину каждой из них. Из полученных значений найдем максимальное.

Python короткое решение

s = open('24-277.txt').readline()
mx = 0
for i in '13579':
    mx = max(mx, *[len(x) for x in s.split(i) if len(set(x) - set('AEIOUY')) == 0])
print(mx)

При использовании сложного списочного выражения можно написать еще более короткое однострочное решение.

Python короткое решение в одну строку

print(max([len(s) for i in '13579' for s in open('24-277.txt').readline().split(i) if len(set(s) - set('AEIOUY')) == 0]))

Классическое решение с посимвольной обработкой можно реализовать на любом языке программирования. В цикле подсчитываем длину непрерывной цепочки гласных букв. Встретив нечетную цифру, сравниваем ее с предыдущей встреченной нечетной цифрой перед непрерывной цепочкой гласных. Если они совпадают, сравниваем длину найденной цепочки с максимальной.

Python универсальное решение

s = open('24-277.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 in 'AEIOUY':
        k+= 1
    else:
        k = 0
        last = ''
print(mx)

PascalABC универсальное решение

var
    k, max, i: Integer;
    s: String;
    last: Char;
    f: TEXT;
begin
    Assign(f, '24-277.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 'AEIOUY'.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-277.txt");
    string s;
    f >> s;
    int k = 0, max = 0;
    string s1 = "13579", s2 = "AEIOUY";
    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;
}

Ответ

456

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

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

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

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