Задача 6677. Источник: Поляков. Задание КИМ 24
(В. Шубинкин) Текстовый файл 24-268.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита и цифры. В файле записаны числа в двадцатеричной системе счисления, окружённые символами, не являющимися цифрами в этой системе счисления или началом/концом файла. Лидирующие нули в записи чисел не допускаются. Определите самое большое чётное число в этом файле. Например, в последовательности символов FF2FTZBBC8R420Y0CCCE содержится 3 числа в двадцатеричной системе счисления: FF2F, BBC8 и 420. Самое большое чётное число – BBC8. Число CCCE не учитывается, так как перед ним стоит ноль.
Алфавит двадцатеричной системы счисления: 0123456789ABCDEFGHIJ.
Решение
Короткое решение основывается на использовании метода строк split. Заменяем все символы, не входящие в двадцатеричную систему счисления на один символ и делим строку по этому символу. Получившиеся подстроки чисел анализируем на условие задачи. В четной системе счисления четность числа эквивалентна четности последнего разряда. Если последний символ строки является цифрой, то его код должен быть четный, а для буквы код должен быть нечетным.
Python
s = open('24-268.txt').readline()
for i in 'KLMNOPQRSTUVWXY':
s = s.replace(i, 'Z')
mx = ''
for i in s.split('Z'):
if len(i) > 0 and i[0] != '0' and (i[-1] in '0123456789') == (ord(i[-1]) % 2 == 0):
if (len(i) > len(mx) or len(i) == len(mx) and i > mx):
mx = i
print(mx)
PascalABC
var
i: Integer;
s, mx: String;
ss: Array of String;
c: Char;
f: TEXT;
begin
Assign(f, '24-268.txt');
Reset(f);
Readln(f, s);
for c := 'K' to 'Y' do
s := s.Replace(c, 'Z');
ss := s.Split('Z');
for i := 0 to ss.Length - 1 do
if (ss[i].Length > 0) and (ss[i][1] <> '0') and
((ss[i][ss[i].Length] in ['0'..'9']) = (ord(ss[i][ss[i].Length]) mod 2 = 0))then
if (ss[i].Length > mx.Length) or (ss[i].Length = mx.Length) and (ss[i] > mx) then
mx := ss[i];
Writeln(mx);
end.
Универсальное решение базируется на посимвольной обработке. Пока встречаются символы двадцатеричной системы счисления, они добавляются к строке r. Встретив символ, который не является цифрой, обрабатываем полученную строку. Обязательно после цикла надо проанализировать конечное значение r, т.к. последнее число в цикле обработано не будет.
Python
s = open('24-268.txt').readline()
r = ''
mxr = ''
for i in s:
if i > 'J':
if len(r) > 0 and r[0] != '0' and (r[-1] in '0123456789') == (ord(r[-1]) % 2 == 0):
if len(r) > len(mxr) or len(r) == len(mxr) and r > mxr:
mxr = r
r = ''
else:
r += i
if len(r) > 0 and r[0] != '0' and (r[-1] in '0123456789') == (ord(r[-1]) % 2 == 0):
if len(r) > len(mxr) or len(r) == len(mxr) and r > mxr:
mxr = r
print(mxr)
PascalABC
var
i: Integer;
s, r, mxr: String;
f: TEXT;
begin
Assign(f, '24-268.txt');
Reset(f);
Readln(f, s);
r := '';
mxr := '';
for i := 1 to s.Length do
if s[i] > 'J' then
begin
if (r.Length > 0) and (r[1] <> '0') and
((r[r.Length] in ['0'..'9']) = (ord(r[r.Length]) mod 2 = 0)) and
((r.Length > mxr.Length) or (r.Length = mxr.Length) and (r > mxr)) then
mxr := r;
r := '';
end
else
r := r + s[i];
if (r.Length > 0) and (r[1] <> '0') and
((r[r.Length] in ['0'..'9']) = (ord(r[r.Length]) mod 2 = 0)) and
((r.Length > mxr.Length) or (r.Length = mxr.Length) and (r > mxr)) then
mxr := r;
Writeln(mxr);
end.
C++
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream f;
f.open("24-268.txt");
string s, r = "", mxr = "", d = "0123456789";
f >> s;
for (int i = 0; i < s.length(); i++)
if (s[i] > 'J')
{
if (r.length() > 0 && r[0] != '0' &&
(d.find(r[r.length() - 1]) != -1) == ((int)r[r.length() - 1] % 2 == 0) &&
(r.length() > mxr.length() || r.length() == mxr.length() && r > mxr))
mxr = r;
r = "";
}
else
r += s[i];
if (r.length() > 0 && r[0] != '0' &&
(d.find(r[r.length() - 1]) != -1) == ((int)r[r.length() - 1] % 2 == 0) &&
(r.length() > mxr.length() || r.length() == mxr.length() && r > mxr))
mxr = r;
cout << mxr << endl;
}
Ответ
85A6J7CE