Неправильный ответ в результате работы программы. - Компьютерные вопросы

Вопрос Неправильный ответ в результате работы программы.

Регистрация
14 Авг 2013
Сообщения
89
Репутация
-2
Спасибо
0
Монет
0
Текстовый файл 24-215.txt содержит строку из символов A, B, C и цифр 1, 2, 3, всего не более чем 10^6символов. Определите максимальное количество идущих подряд пар символов вида «буква + цифра».





f = open('24-215.txt').read()



res = ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']



k = 0

m = 0



for i in range(0, len(f) - 1, 2):

if f[i: i + 2] in res:

k += 1

else:

m = max(m, k)

k = 0



print(m)

Выдает 171 вместо 183.
 
Регистрация
28 Авг 2013
Сообщения
68
Репутация
0
Спасибо
0
Монет
0
Проблема в вашем коде заключается в том, что он обрабатывает пары символов только с шагом 2. Это значит, что он пропускает случаи, когда пары "буква+цифра" перекрываются.

Пример:

Строка: A1B2C3A1A2

Ваш код обработает пары: A1, C3, A2. Он пропустит пары B2, A1. Правильный ответ в данном случае — 4 (пары A1, B2, C3, A1).

Исправленный код:

Python

f = open('24-215.txt').read()

res = ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']

max_count = 0
current_count = 0

for i in range(len(f) - 1): # Итерируемся по *всем* символам, кроме последнего
pair = f[i:i + 2] # Создаем пару символов
if pair in res:
current_count += 1
else:
max_count = max(max_count, current_count)
current_count = 0

max_count = max(max_count, current_count) # Проверка после последнего символа

print(max_count)
Объяснение изменений:

Цикл for i in range(len(f) - 1):: Теперь цикл проходит по каждому символу строки, кроме последнего. Это позволяет проверять все возможные пары, включая перекрывающиеся.
pair = f[i:i + 2]: Создаем пару символов, начиная с текущего индекса i.
max_count = max(max_count, current_count): Это строка очень важна. После того, как последовательность пар прерывается (встречается неверная пара), мы сравниваем текущее количество (current_count) с максимальным, найденным ранее (max_count), и сохраняем большее из них в max_count.
max_count = max(max_count, current_count) (после цикла): После завершения цикла нужно еще раз проверить max_count и current_count. Это необходимо, так как максимальная последовательность может находиться в конце строки, и тогда условие else внутри цикла не выполнится.
 
Регистрация
24 Мар 2013
Сообщения
63
Решения
1
Репутация
0
Спасибо
1
Монет
0
Пере проверь всë, может где-то ошибся?)
 
Регистрация
17 Июн 2013
Сообщения
82
Репутация
0
Спасибо
1
Монет
0
1) Не учитываешь последовательности, начинающиеся с нечётной позиции.
2) Не обрабатываешь последнюю подстроку.

И замечания общего вида:
3) in в массиве - это полный перебор значений массива, долго. Для этого есть множества.
4) Складывать в коллекцию все возможные комбинации - немасштабируемый подход. Если бы были все буквы и все цифры, 260 элементов бы перечислял?
5) Открытый файл кто закрывать будет?

Проще сделать так: m = l = e = 0

with open('24-215.txt', 'r') as f:
s = next(f)

for c in s:
d = c.isdigit()
if e == d:
l += 1
e ^= 1
else:
m = max(l // 2, m)
l = e = 0

m = max(l // 2, m)

print(m)
Встретили букву - считаем чередующиеся буквы и цифры. Целочисленная половина получившейся длины - это кол-во идущих подряд пар. И в конце не забываем закрыть последовательность. Если в конце файла - перевод строки и вообще любые символы, кроме букв и цифр, на результат они не повлияют.
Файл закрывается по выходу из блока with.
 
Регистрация
11 Ноя 2013
Сообщения
90
Репутация
0
Спасибо
0
Монет
0
s = open('24-215.txt').read() + '@@' # чтобы не заморачиваться с последней подстрокой
end = len(s) - 1 # чтобы не считать на каждой итерации
begin = 0 # левая граница текущей подстроки
i = 0
m = 0
while i < end:
if s.isalpha() and s[i + 1].isdigit(): # проверяем 2 символа
i += 2 # сдвигаемся на 2 символа вправо
else:
m = max(m, i - begin) # пересчитываем максимум
i += 1 # сдвигаемся на 1 символ вправо
begin = i # сдвигаем левую границу подстроки
print(m // 2)
 
Сверху Снизу