Задача 5640. Источник: Поляков. Задание КИМ 24
(П. Финкель) Текстовый файл 24-225.txt состоит не более чем из 106 символов и содержит буквы английского алфавита и цифры. Определите максимальное число в этом файле, ограниченное двумя парами символов FF и удовлетворяющее маске «44??78???3», где символ ? обозначает любую цифру. Пример такого числа: 4434781233. Найдите сумму чётных цифр найденного числа.
Решение
Если просмотреть файл с исходной строкой, то там обнаруживаются последовательности из трех букв F, которые не будут корректно обрабатываться методом split. Хотя в данном файле нет чисел после такой последовательности, нет гарантии отсутствия таковых в другом файле. Гарантированное правильное решение требует последовательного поиска последовательностей FF в строке и анализа подстрок между ними. Решить данную задачу можно как посимвольным анализом строки, так и использованием стандартных средств поиска подстроки в строке.
Python через посимвольный анализ
s = open('24-225.txt').readline()
mx = ''
last = -1
for i in range(len(s) - 1):
if s[i] == 'F' and s[i + 1] == 'F':
if last != - 1:
s1 = s[last + 2:i]
if len(s1) == 10 and s1.isdigit():
if s1[:2] == '44' and s1[4:6] == '78' and s1[9] == '3':
mx = max(mx, s1)
last = i
sm = 0
for c in mx:
if int(c) % 2 == 0:
sm += int(c)
print(sm)
Python через поиск в строке
s = open('24-225.txt').readline()
mx = ''
start = s.find('FF')
while (start != -1):
finish = s.find('FF', start + 1)
if finish != -1:
s1 = s[start + 2: finish]
if len(s1) == 10 and s1.isdigit():
if s1[:2] == '44' and s1[4:6] == '78' and s1[9] == '3':
mx = max(mx, s1)
start = finish
sm = 0
for c in mx:
if int(c) % 2 == 0:
sm += int(c)
print(sm)
PascalABC через посимвольный анализ
function IsDigit(s: String): Boolean;
var
c: Char;
begin
result := True;
foreach c in s do
if not c.IsDigit() then
begin
result := False;
break;
end;
end;
var
last, i, sum: Integer;
max, s, s1: String;
c: Char;
f: TEXT;
begin
Assign(f, '24-225.txt');
Reset(f);
Readln(f, s);
max := '';
last := -1;
for i := 1 to s.Length - 1 do
if (s[i] = 'F') and (s[i + 1] = 'F') then
begin
if last <> -1 then
begin
s1 := s[last + 2:i];
if (s1.Length = 10) and IsDigit(s1) then
if (s1[:3] = '44') and (s1[5:7] = '78') and (s1[10] = '3') then
if s1 > max then
max := s1;
end;
last := i;
end;
sum := 0;
foreach c in max do
if ord(c) mod 2 = 0 then
sum := sum + (ord(c) - 48);
Writeln(sum);
end.
PascalABC через поиск в строке
function IsDigit(s: String): Boolean;
var
c: Char;
begin
result := True;
foreach c in s do
if not c.IsDigit() then
begin
result := False;
break;
end;
end;
var
start, finish, sum: Integer;
max, s, s1: String;
c: Char;
f: TEXT;
begin
Assign(f, '24-225.txt');
Reset(f);
Readln(f, s);
max := '';
start := s.IndexOf('FF');
while start <> -1 do
begin
finish := s.IndexOf('FF', start + 1);
if finish <> -1 then
begin
s1 := s[start + 3:finish + 1];
if (s1.Length = 10) and IsDigit(s1) then
if (s1[:3] = '44') and (s1[5:7] = '78') and (s1[10] = '3') then
if s1 > max then
max := s1;
end;
start := finish;
end;
sum := 0;
foreach c in max do
if ord(c) mod 2 = 0 then
sum := sum + (ord(c) - 48);
Writeln(sum);
end.
C++ через посимвольный анализ
#include <iostream>
#include <fstream>
using namespace std;
bool isdigit(string s)
{
for (int i = 0; i < s.length(); i++)
if (s[i] < '0' or s[i] > '9')
return false;
return true;
}
int main()
{
ifstream f;
f.open("24-225.txt");
string s, max = "";
f >> s;
int last = -1;
for (int i = 0; i < s.length() - 1; i++)
if (s[i]== 'F' && s[i + 1] == 'F')
{
if (last != -1)
{
string s1 = s.substr(last + 2, i - last - 2);
if (s1.length() == 10 and isdigit(s1))
if (s1.substr(0, 2) == "44" && s1.substr(4, 2) == "78" && s1[9] == '3')
if (s1 > max)
max = s1;
}
last = i;
}
int sum = 0;
for (int i = 0; i < max.length(); i++)
if ((int)max[i] % 2 == 0)
sum += (int)max[i] - 48;
cout << sum << endl;
}
C++ через поиск в строке
#include <iostream>
#include <fstream>
using namespace std;
bool isdigit(string s)
{
for (int i = 0; i < s.length(); i++)
if (s[i] < '0' or s[i] > '9')
return false;
return true;
}
int main()
{
ifstream f;
f.open("24-225.txt");
string s, max = "";
f >> s;
int start = s.find("FF");
while (start != -1)
{
int finish = s.find("FF", start + 1);
if (finish != -1)
{
string s1 = s.substr(start + 2, finish - start - 2);
if (s1.length() == 10 and isdigit(s1))
if (s1.substr(0, 2) == "44" && s1.substr(4, 2) == "78" && s1[9] == '3')
if (s1 > max)
max = s1;
}
start = finish;
}
int sum = 0;
for (int i = 0; i < max.length(); i++)
if ((int)max[i] % 2 == 0)
sum += (int)max[i] - 48;
cout << sum << endl;
}
Ответ
38