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

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

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

Текстовый файл 24-241.txt состоит не более чем из 106 символов и содержит только латинские буквы A, B, C, D, E, F, O. Определите длину самой короткой цепочки символов, которая начинается и заканчивается буквой E, между двумя последовательными буквами E содержит ровно две буквы B, а между этими буквами B – более 5 букв A.

Решение

Разделим строку на подстроки по букве E с помощью метода split и проанализируем каждую подстроку на наличие двух букв B и количество букв A между ними.

Python

s = open('24-241.txt').readline()
mn = len(s)
for i in s.split('E')[1:-1]:
    if i.count('B') == 2 and i[i.find('B') + 1:i.rfind('B')].count('A') > 5:
        mn = min(mn, len(i) + 2)
print(mn)

PascalABC

function Count(s: String; c: Char): Integer;
var
    i: Integer;
begin
    result := 0;
    for i := 1 to s.Length do
        if s[i] = c then
            result := result + 1;
end;

var
    min, n1, n2: Integer;
    s, i: String;
    sl: Array of String;
    f: TEXT;
begin
    Assign(f, '24-241.txt');
    Reset(f);
    Readln(f, s);
    sl := s.Split('E');
    min := s.Length;
    foreach i in sl[1:sl.Length - 1] do
        if Count(i, 'B') = 2 then
        begin
            n1 := i.IndexOf('B') + 2;
            n2 := i.LastIndexOf('B') + 1 ;
            if (Count(i[n1:n2], 'A') > 5) and (i.Length + 2 < min) then
                min := i.Length + 2;
        end;
    Writeln(min);
end.

C++

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int count(string s, char c)
{
    int n = 0;
    for (int i = 0; i < s.length(); i++)
        if (s[i] == c)
            n++;
    return n;
}

vector<string> split(string s, char c)
{
    vector<string> r;
    int last = -1, cur = s.find(c);
    while (cur != -1)
    {
        r.push_back(s.substr(last + 1, cur - last - 1));
        last = cur;
        cur = s.find(c, cur + 1);
    }
    r.push_back(s.substr(last + 1, s.length() - last - 1));
    return r;
}

int main()
{
    ifstream f;
    f.open("24-241.txt");
    string s;
    f >> s;
    vector<string> sl = split(s, 'E');
    sl.erase(sl.begin());
    sl.erase(sl.end() - 1);
    int min = s.length();
    for (string i : sl)
        if (count(i, 'B') == 2)
        {
            int n1 = i.find('B') + 1, n2 = i.rfind('B');
            if (count(i.substr(n1, n2 - n1), 'A') > 5 && i.length() + 2 < min)
                min = i.length() + 2;
        }
    cout << min << endl;
}

Ответ

13

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

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

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

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