Текстовый файл состоит из десятичных цифр и заглавных букв латинского алфавита. Определите в прилагаемом файле последовательность из максимального количества символов, начинающуюся и заканчивающуюся одной и той же нечётной цифрой, содержащую идущие подряд буквы и не содержащую других цифр, кроме первой и последней. Искомая последовательность должна
содержать одинаковое количество гласных и согласных букв.
Если таких несколько, выберите последовательность с наибольшим порядковым номером в файле её первого символа.
В ответе запишите число — порядковый номер в файле первого символа найденной последовательности. В прилагаемом файле нумерация символов начинается с нуля.
Для выполнения этого задания следует написать программу.
Примечание: А, Е, I, О, U, Y — гласные буквы латинского алфавита.
В, С, D, F, G, Н, J, К, L, М, N, Р, Q, R, S, Т, V, W, Х, Z — согласные буквы латинского алфавита.
Решение:
Программа ищет самую длинную последовательность:
- начинающуюся и заканчивающуюся одной и той же нечётной цифрой;
- содержащую внутри только буквы;
- имеющую одинаковое количество гласных и согласных букв.
Если таких последовательностей несколько, выбирается та, которая начинается правее.
В ответ выводится индекс первого символа найденной последовательности.
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
s = open('24.txt').readline() vowels = 'AEIOUY' odd = '13579' start_digit = '' start_pos = -1 v = 0 c = 0 ans_len = 0 ans_pos = -1 for i in range(len(s)): if s[i].isdigit(): if start_digit != '': if s[i] == start_digit and v == c: length = i - start_pos + 1 if length > ans_len or length == ans_len and start_pos > ans_pos: ans_len = length ans_pos = start_pos if s[i] in odd: start_digit = s[i] start_pos = i v = 0 c = 0 else: start_digit = '' start_pos = -1 v = 0 c = 0 else: if start_digit != '': if s[i] in vowels: v += 1 else: c += 1 print(ans_pos) |
Подробное объяснение
1. Считывание строки
|
|
s = open('24.txt').readline() |
Считываем строку из файла.
2. Гласные и нечётные цифры
|
|
vowels = 'AEIOUY' odd = '13579' |
В строке vowels записаны все гласные буквы латинского алфавита.
В строке odd записаны все нечётные цифры.
3. Переменные для текущей последовательности
|
|
start_digit = '' start_pos = -1 |
start_digit — цифра, с которой начинается текущая последовательность.
start_pos — позиция начала текущей последовательности.
4. Счётчики букв
v — количество гласных.
c — количество согласных.
5. Переменные ответа
ans_len — длина лучшей найденной последовательности.
ans_pos — индекс её первого символа.
6. Проход по строке
Посимвольно просматриваем всю строку.
7. Если встретили цифру
Проверяем, является ли текущий символ цифрой.
8. Проверка завершения последовательности
|
|
if start_digit != '': if s[i] == start_digit and v == c: |
Если последовательность уже была начата:
- проверяем, совпадает ли текущая цифра с начальной;
- проверяем, равны ли количества гласных и согласных.
Если оба условия выполняются — последовательность подходит.
9. Вычисление длины
|
|
length = i - start_pos + 1 |
Находим длину текущей последовательности.
10. Обновление ответа
|
|
if length > ans_len or length == ans_len and start_pos > ans_pos: ans_len = length ans_pos = start_pos |
Обновляем ответ:
- если новая последовательность длиннее;
- или если длины равны, но новая начинается правее.
11. Начало новой последовательности
|
|
if s[i] in odd: start_digit = s[i] start_pos = i v = 0 c = 0 |
Если текущий символ — нечётная цифра, начинаем новую последовательность:
- запоминаем цифру;
- запоминаем позицию;
- обнуляем счётчики букв.
12. Если цифра чётная
|
|
else: start_digit = '' start_pos = -1 v = 0 c = 0 |
Если встретили чётную цифру, текущая последовательность становится недействительной.
13. Если встретили букву
|
|
else: if start_digit != '': |
Буквы учитываются только внутри активной последовательности.
14. Подсчёт гласных и согласных
|
|
if s[i] in vowels: v += 1 else: c += 1 |
Если буква гласная — увеличиваем счётчик гласных.
Иначе увеличиваем счётчик согласных.
15. Вывод ответа
Выводим индекс начала найденной последовательности.
Ответ: 5165092