Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Пожалуйста помогите решить задачу на питоне

Сергей Крылов Ученик (99), на голосовании 9 месяцев назад
(№ 5252) (М. Шагитов) В файле 17-328.txt (https://kpolyakov.spb.ru/cms/files/ege-seq/17-328.txt) содержится последовательность целых чисел. Элементы последовательности – четырёхзначные натуральные числа. Найдите все тройки элементов последовательности, для которых восьмеричная запись суммы любой пары чисел тройки не содержит цифру 7, а сумма всех чисел тройки меньше, чем среднее арифметическое всех нечётных чисел в файле. В ответе запишите количество найденных троек, затем максимальную из сумм элементов таких троек. В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.
Голосование за лучший ответ
Avis Оракул (90841) 10 месяцев назад
>>Программисты, не бейте. Да, говнокодерство.

1. Несмотря на уточнения про тройки, этот момент всё равно написан криво. Идущие подряд элементы могут быть разбиты на независимые вот так:А могут браться с предыдущими элементами вот так:В обоих случаях это будут три идущих подряд элемента, но результат будет принципиально разный.
2. Решение:
 from itertools import combinations 

with open('17-328.txt', 'r') as file: #читаем файл и формируем список
data = [int(line.strip()) for line in file]

def avg_odd(lst): #поиск среднего арифметического нечетных элементов
odds = [i for i in lst if i%2] #все нечетные элементы списка
avg = sum(odds)/len(odds)
return avg

def check_pairs(lst,CR=''): #проверка на наличие числа CR в OCT-записи суммы всех пар чисел списка
sum_of_pairs = [sum(i) for i in list(combinations(lst,2))] #сумма всех пар списка
s = list(map(oct,sum_of_pairs)) #перевод всех сумм в OCT
res = str(CR) not in ''.join(s) #отсутствие числа CR среди всех элементов
return res

def window(lst,aliasing=False):
sublst=[lst[i:i+3] for i in range(0,len(lst),[3,1][aliasing])] #Разбиение на тройки, aliasing - перекрытие
res = [x for x in sublst if check_pairs(x,'7') and sum(x) return res

l_res = len(window(data))
m_res = max([sum(i) for i in window(data)])

print(f'Count of triples: {l_res}',f'Max sum: {m_res}',sep='\n')
В функции window есть аргумент aliasing (перекрытие). По умолчанию он равен False, но если в обращении к функции написать 1 или True, то окно будет двигаться и забирать элементы с перекрытием как на второй картинке.
Похожие вопросы