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

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

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

(В. Шубинкин) Текстовый файл 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

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

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

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

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