Задача 6680. Источник: Поляков. Задание КИМ 24
(В. Шубинкин) Текстовый файл 24-271.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита, цифры и символы #, &, %. Удалось выяснить, что если в тексте сообщения встречается символ #, а вслед за ним 6 символов, которые могут представлять запись числа в шестнадцатеричной системе счисления, то эти 6 символов задают цвет в формате RGB. Определите, сколько раз в таких подстроках встречаются цвета, у которых ведущей является красная компонента. Под ведущей компонентой понимается цвет, интенсивность которого выше (числовое значение строго больше) остальных. Например, в строке EE#FA77AF7EEAAA%#44#AAAA88 есть три подстроки, задающие цвет: #FA77AF, #0055EE, #AAAA88. Только в одной из них (#FA77AF) интенсивность красной компоненты выше интенсивностей других компонент.
Решение
Последовательно просматриваем строку. Встретив символ #, анализируем, является ли следующая шестерка символов шестнадцатеричным числом и преобладает ли красный компонент в этом числе. На Python для анализа удобнее применять итераторы map и all, а так же функцию int, а на остальных языках анализ можно проводить посимвольно или через созданные функции. Посимвольный анализ будет меньше по объему кода.
Python с использованием итераторов
s = open('24-271.txt').readline()
k = 0
for i in range(len(s) - 6):
if (s[i] == '#' and all(map(lambda x: '0' <= x <= 'F', s[i + 1: i + 7])) and
int(s[i + 1: i + 3], 16) > int(s[i + 3: i + 5], 16) and
int(s[i + 1: i + 3], 16) > int(s[i + 5: i + 7], 16)):
k += 1
print(k)
Python с посимвольным анализом
s = open('24-271.txt').readline()
k = 0
for i in range(len(s) - 6):
if (s[i] == '#' and
'0' <= s[i + 1] <= 'F' and '0' <= s[i + 2] <= 'F' and
'0' <= s[i + 3] <= 'F' and '0' <= s[i + 4] <= 'F' and
'0' <= s[i + 5] <= 'F' and '0' <= s[i + 6] <= 'F' and
int(s[i + 1: i + 3], 16) > int(s[i + 3: i + 5], 16) and
int(s[i + 1: i + 3], 16) > int(s[i + 5: i + 7], 16)):
k += 1
print(k)
PascalABC с посимвольным анализом
var
k, i: Integer;
s: String;
f: TEXT;
begin
Assign(f, '24-271.txt');
Reset(f);
Readln(f, s);
k := 0;
for i := 1 to s.Length - 6 do
if (s[i] = '#') and
(s[i + 1] >= '0') and (s[i + 1] <= 'F') and
(s[i + 2] >= '0') and (s[i + 2] <= 'F') and
(s[i + 3] >= '0') and (s[i + 3] <= 'F') and
(s[i + 4] >= '0') and (s[i + 4] <= 'F') and
(s[i + 5] >= '0') and (s[i + 5] <= 'F') and
(s[i + 6] >= '0') and (s[i + 6] <= 'F') and
((s[i + 1] > s[i + 3]) or (s[i + 1] = s[i + 3]) and (s[i + 2] > s[i + 4])) and
((s[i + 1] > s[i + 5]) or (s[i + 1] = s[i + 5]) and (s[i + 2] > s[i + 6])) then
k := k + 1;
Writeln(k);
end.
PascalABC с использованием функций
function is_hex(s: String): Boolean;
var
i: Integer;
begin
result := True;
for i := 1 to s.Length do
if (s[i] < '0') or (s[i] > 'F') then
begin
result := False;
break;
end;
end;
function hex_first_big(s1, s2: String): Boolean;
var
n1, n2, i: Integer;
begin
n1 := 0;
for i := 1 to s1.Length do
if s1[i] <= '9' then
n1 := n1 * 16 + ord(s1[i]) - 48
else
n1 := n1 * 16 + ord(s1[i]) - 55;
n2 := 0;
for i := 1 to s2.Length do
if s2[i] <= '9' then
n2 := n2 * 16 + ord(s2[i]) - 48
else
n2 := n2 * 16 + ord(s2[i]) - 55;
result := n1 > n2;
end;
var
k, i: Integer;
s: String;
f: TEXT;
begin
Assign(f, '24-271.txt');
Reset(f);
Readln(f, s);
k := 0;
for i := 1 to s.Length - 6 do
if (s[i] = '#') and is_hex(s[i + 1:i + 7]) and
hex_first_big(s[i + 1:i + 3], s[i + 3:i + 5]) and
hex_first_big(s[i + 1:i + 3], s[i + 5:i + 7]) then
k := k + 1;
Writeln(k);
end.
C++ с посимвольным анализом
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream f;
f.open("24-271.txt");
string s;
f >> s;
int k = 0;
for (int i = 0; i < s.length() - 6; i++)
if (s[i] == '#' &&
s[i + 1] >= '0' && s[i + 1] <= 'F' &&
s[i + 2] >= '0' && s[i + 2] <= 'F' &&
s[i + 3] >= '0' && s[i + 3] <= 'F' &&
s[i + 4] >= '0' && s[i + 4] <= 'F' &&
s[i + 5] >= '0' && s[i + 5] <= 'F' &&
s[i + 6] >= '0' && s[i + 6] <= 'F' &&
(s[i + 1] > s[i + 3] || s[i + 1] == s[i + 3] && s[i + 2] > s[i + 4]) &&
(s[i + 1] > s[i + 5] || s[i + 1] == s[i + 5] && s[i + 2] > s[i + 6]))
k++;
cout << k << endl;
}
C++ с использованием функций
#include <iostream>
#include <fstream>
using namespace std;
bool is_hex(string s)
{
for (int i = 0; i < s.length(); i++)
if (s[i] < '0' || s[i] > 'F')
return false;
return true;
}
bool hex_first_big(string s1, string s2)
{
int n1 = 0, n2 = 0;
for (int i = 0; i < s1.length(); i++)
if (s1[i] <= '9')
n1 = n1 * 16 + (int)s1[i] - 48;
else
n1 = n1 * 16 + (int)s1[i] - 55;
for (int i = 0; i < s2.length(); i++)
if (s2[i] <= '9')
n2 = n2 * 16 + (int)s2[i] - 48;
else
n2 = n2 * 16 + (int)s2[i] - 55;
return n1 > n2;
}
int main()
{
ifstream f;
f.open("24-271.txt");
string s;
f >> s;
int k = 0;
for (int i = 0; i < s.length() - 6; i++)
if (s[i] == '#' && is_hex(s.substr(i + 1, 6)) &&
hex_first_big(s.substr(i + 1, 2), s.substr(i + 3, 2)) &&
hex_first_big(s.substr(i + 1, 2), s.substr(i + 5, 2)))
k++;
cout << k << endl;
}
Ответ
3369