Задача 6054. Источник: Поляков. Задание КИМ 24
Текстовый файл 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