Top.Mail.Ru
Ответы

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

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


123456789101112131415
 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.

По дате
По рейтингу
Аватар пользователя
Высший разум
4мес

1) Не учитываешь последовательности, начинающиеся с нечётной позиции.
2) Не обрабатываешь последнюю подстроку.

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

Проще сделать так:

1234567891011121314151617
 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.

Аватар пользователя
Высший разум
4мес
12345678910111213
 s = open('24-215.txt').read() + '@@' # чтобы не заморачиваться с последней подстрокой
end = len(s) - 1 # чтобы не считать на каждой итерации
begin = 0 # левая граница текущей подстроки
i = 0
m = 0
while i < end:
  if s[i].isalpha() and s[i + 1].isdigit(): # проверяем 2 символа
    i += 2 # сдвигаемся на 2 символа вправо
  else:
    m = max(m, i - begin) # пересчитываем максимум
    i += 1 # сдвигаемся на 1 символ вправо
    begin = i # сдвигаем левую границу подстроки
print(m // 2) 


Если же исправлять твой код, то:

1234567891011121314
 def max_len(s, start):
    res = ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
    k = 0
    m = 0
    for i in range(start, len(f) + 1, 2): # +1 чтобы гарантировано обработать последнюю подстроку
        if f[i: i + 2] in res:  
            k += 1
        else:
            m = max(m, k)
            k = 0
    return m

f = open('24-215.txt').read()
print(max(max_len(f, 0), max_len(f, 1))) 

Отдельно обрабатываем подстроки, начинающиеся на чётных позициях, и отдельно на начётных. Но это требует 2 прохода по строке.

Аватар пользователя
Ученик
4мес

f=open('24-215.txt')
alp=['A', 'B', 'C']
cip=['1', '2', '3']
a=[i for i in f.read ()]
c=0
cl=0
for i in range(1, len(a)):
if a[i-1] in alp and a[i] in cip:
for j in range(i, len(a), 2):
if a[j-1] in alp and a[j] in cip:
cl+=1
else:
c=max(c, cl)
cl=0
break
print(c)

Аватар пользователя
Мыслитель
4мес
12345678910111213141516171819202122
 f = open('24-215.txt').read().strip() 
valid_pairs = {'A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3'} 
 
max_len = 0 
prev_length = [0, 0]  # [even, odd] 
 
for i in range(len(f) - 1): 
    pair = f[i] + f[i+1] 
    if pair in valid_pairs: 
        parity = i % 2 
        if i >= 2: 
            prev_parity = (i - 2) % 2 
            current_length = prev_length[prev_parity] + 1 
        else: 
            current_length = 1 
        prev_length[parity] = current_length 
        if current_length > max_len: 
            max_len = current_length 
    else: 
        prev_length[i % 2] = 0 
 
print(max_len) 


ещё лучше:

f=open('24-215.txt').read().strip()
m=p=[0,0]
v={*'A1 A2 A3 B1 B2 B3 C1 C2 C3'.split()}
for i in range(len(f)-1):
c=i%2; t=f[i:i+2]
p[c] = (p[c]*(i>=2 and f[i-2:i]in v)+1)*(t in v)
m = max(m,p[c])
print(max(m))

Аватар пользователя
Мудрец
4мес

Пере проверь всë, может где-то ошибся?)