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

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

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

(А. Богданов) Текстовый файл 24-252.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита и десятичные цифры. Найдите минимальную длину подстроки, содержащей в порядке возрастания все шестнадцатеричные цифры. Строка может включать повторяющиеся цифры и другие символы.

Решение

Пока интересующая нас последовательность была обнаружена, находим позицию следующего символа 0 и далее последовательно ищем позицию каждой следующей цифры. Дойдя до символа F, анализируем длину получившейся подстроки.

Python

s = open('24-252.txt').readline()
mn = len(s)
last = -1
found = True
while found:
    last = s.find('0', last + 1)
    c = '1'
    cur = last
    while c <= 'F':
        cur = s.find(c, cur + 1)
        if cur == -1:
            found = False
            break
        if c == '9':
            c = 'A'
        else:
            c = chr(ord(c) + 1)
    if found:
        mn = min(mn, cur - last + 1)
print(mn)

PascalABC

var
    min, last, cur, i: Integer;
    s: String;
    found: Boolean;
    c: Char;
    f: TEXT;
begin
    Assign(f, '24-252.txt');
    Reset(f);
    Readln(f, s);
    min := s.Length;
    last := 0;
    found := True;
    while found do
    begin
        last := s.IndexOf('0', last + 1);
        c := '1';
        cur := last;
        while c <= 'F' do
        begin
            cur := s.IndexOf(c, cur + 1);
            if cur = -1 then
            begin
                found := False;
                break;
            end;
            if c = '9' then
                c := 'A'
            else
                c := chr(ord(c) + 1);
        end;
        if found and (cur - last + 1 < min) then
            min := cur - last + 1;
    end;
    Writeln(min);
end.

C++

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream f;
    f.open("24-252.txt");
    string s;
    f >> s;
    int min = s.length(), last = -1;
    bool found = true;
    while (found)
    {
        last = s.find('0', last + 1);
        char c = '1';
        int cur = last;
        while (c <= 'F')
        {
            cur = s.find(c, cur + 1);
            if (cur == -1)
            {
                found = false;
                break;
            }
            if (c == '9')
                c = 'A';
            else
                c++;
        }
        if (found && cur - last + 1 < min)
            min = cur - last + 1;
    }
    cout << min << endl;
}

Перебор символов шестнадцатеричной системы счисления так же можно реализовать через использование строки. Объем кода уменьшится.

Python

s = open('24-252.txt').readline()
mn = len(s)
last = -1
found = True
while found:
    last = s.find('0', last + 1)
    cur = last
    for c in '123456789ABCDEF':
        cur = s.find(c, cur + 1)
        if cur == -1:
            found = False
            break
    if found:
        mn = min(mn, cur - last + 1)
print(mn)

PascalABC

var
    min, last, cur, i: Integer;
    s: String;
    found: Boolean;
    c: Char;
    f: TEXT;
begin
    Assign(f, '24-252.txt');
    Reset(f);
    Readln(f, s);
    min := s.Length;
    last := 0;
    found := True;
    while found do
    begin
        last := s.IndexOf('0', last + 1);
        cur := last;
        foreach c in '123456789ABCDEF' do
        begin
            cur := s.IndexOf(c, cur + 1);
            if cur = -1 then
            begin
                found := False;
                break;
            end;
        end;
        if found and (cur - last + 1 < min) then
            min := cur - last + 1;
    end;
    Writeln(min);
end.

C++

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream f;
    f.open("24-252.txt");
    string s;
    char d[] = "123456789ABCDEF";
    f >> s;
    int min = s.length(), last = -1;
    bool found = true;
    while (found)
    {
        last = s.find('0', last + 1);
        int cur = last;
        for (char* c = d; *c != 0; c++)
        {
            cur = s.find(*c, cur + 1);
            if (cur == -1)
            {
                found = false;
                break;
            }
        }
        if (found && cur - last + 1 < min)
            min = cur - last + 1;
    }
    cout << min << endl;
}

Ответ

153

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

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

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

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