Задача 6225. Источник: Поляков. Задание КИМ 24
(А. Богданов) Текстовый файл 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