Форум » Электронные таблицы » Демоверсия ФИПИ на 2023 год 9 задача » Ответить

Демоверсия ФИПИ на 2023 год 9 задача

konyashkind: Добрый день! Помогите пожалуйста найти ошибку в программе. Задача: Откройте файл электронной таблицы, содержащей в каждой строке шесть натуральных чисел. Определите количество строк таблицы, содержащих числа, для которых выполнены оба условия: – в строке только одно число повторяется ровно два раза, остальные числа различны; – среднее арифметическое неповторяющихся чисел строки не больше суммы повторяющихся чисел. В ответе запишите только число. Решение: [pre2]count = 0 f = open("9.csv") for s in f: si = [0] * 6 # в si хранится строка, переведенная в целые числа s = s.split(";") if (s.count(s[0]) + s.count(s[1]) + s.count(s[2]) + s.count(s[3]) + s.count(s[4]) +s.count(s[5])) == 8: #проверяю наличие в строке одинаковых элементов for i in range(6): si = int(s) #если такие есть, перевожу строку в числа for i in range(6): if s.count(s) == 2 and (si * 2) >= ((sum(si) - si * 2)// 4): count += 1 break #если нашел в строке два совпадающих элемента #проверяю будет ли их сумма больше либо равна среднему остальных 4 #если да увеличиваю количество найденых строк и перехожу к следующей строке print(count) f.close()[/pre2] С ответом не сходится.

Ответов - 11

konyashkind: Разобрался! Ошибка глупейшая :(. При считывании из строки к последнему символу добавляется символ перехода на новую строку. Соответственно потерял все строки, где конечный символ был парным.

s11kai: konyashkind пишет: Ошибка глупейшая : Друг, подскажи как ты от нее избавился! Опубликуй код, только переменные i замени на j, пожалуйста!!! Спасибо

s11kai: konyashkind пишет: С ответом не сходится. А эта программа вообще то работает? У меня она печатает: line 14, in <module> si = int(s) TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'


s11kai: Попробовал решить эту задачку в таблице, получилось строк – 2236. Подскажите, кто может, что я мог не учесть. Спасибо!

s11kai: s11kai пишет: Попробовал решить эту задачку в таблице В опубликованном решении задействовано 9 столбцов, я использовал несколько иной подход и поэтому решение заняло всего 7 столбцов. Если кому будет интересно, то вот их значения: G1 =ЕСЛИ(СЧЁТЕСЛИ(A1:F1;A1)>1;A1*2;0) H1 =ЕСЛИ(СЧЁТЕСЛИ(B1:F1;B1)>1;B1*2;0) I1 =ЕСЛИ(СЧЁТЕСЛИ(C1:F1;C1)>1;C1*2;0) J1 =ЕСЛИ(СЧЁТЕСЛИ(D1:F1;D1)>1;D1*2;0) K1 =ЕСЛИ(СЧЁТЕСЛИ(E1:F1;E1)>1;E1*2;0) L1 =ЕСЛИ(СУММ(G1:K1)=МАКС(G1:K1);(СУММ(A1:F1)-МАКС(G1:K1))/4;0) M1 =ЕСЛИ(И(L1>0;L1<=СУММ(G1:K1));1;0)

s11kai: s11kai пишет: Попробовал решить эту задачку в таблице, получилось строк – 2236. Нашел, не учел что среднее значение может быть и равно сумме одинаковых чисел! А программа не работает потому, что html страница форума, код si'['i']' - принимает его за тег шрифта италик и удаляет его изменяя саму программу. Для сохранения работоспособности кода программ после публикации нужно только переменную i заменить на j. Здесь интересно другое, почему в строке к последней цифре приписывается код "\n". Кто-нибудь может подсказать, как избавиться от этого кода? Нашел совет в интернете: f = open("9_.csv").read().split() Код действительно отбрасывается, но при этом появляется ошибка закрытия файла Спасибо

s11kai: konyashkind пишет: Разобрался! Ошибка глупейшая :(. При считывании из строки к последнему символу добавляется символ перехода на новую строку. Соответственно потерял все строки, где конечный символ был парным. Добрый день, konyashkind! У тебя там есть и другая ошибка, не устранив которую, не получишь верного ответа. Вот маленький тест - код демонстрирующий эту ошибку: x=12+18+89+10+36+18 x2=2*18 sr1=(x-x2)/4 sr2=(x-x2)//4 print(x,x2,sr1,sr2) 183 36 36.75 36 Кстати, на сайте уже опубликованы интересные решения данной задачи от авторов Е. Филина и А. Рогов.

s11kai: Предлагаю взглянуть и на мое решение, вдруг будет интересно, оно построено только на базовых понятиях: [pre2] otvet = 0 with open("9.csv") as f: for s in f: su = c = 0 si = [0]*6 s = s.split(";") for j in range(6): si[j] = int(s[j]) su = su+si[j] for j in range(5): for jj in range(j+1,6): if int(s[j])==int(s[jj]): c+=1 pam = 2*int(s[j]) if (c==1) and (pam >= (su - pam)/4): otvet+=1 print('otvet:',otvet) f.close() #можно не использовать [/pre2]

s11kai: Константин Юрьевич, здравствуйте! Возник один вопрос, во всех "старых" языках программирования было правило: после открытия файла и обработки данных необходимо его обязательно закрыть. Но, в опубликованных решениях код закрытия отсутствует, неужели в питоне разрешено открытые файлы после использования не закрывать? Спасибо!

Поляков: s11kai пишет: Возник один вопрос, во всех "старых" языках программирования было правило: после открытия файла и обработки данных необходимо его обязательно закрыть. Но, в опубликованных решениях код закрытия отсутствует, неужели в питоне разрешено открытые файлы после использования не закрывать? Александр Иванович, во всех известных мне языках файлы автоматически закрываются и деблокируются после завершения работы программы. Незакрытие файла может быть критично, если программа несколько раз открывает и не закрывает файл на запись/добавление. Хотя такой вариант (без закрытия), конечно, некрасивый и его следует избегать. Кроме того, при использовании некоторых конструкций в Python, например, with-as, файл закрывается автоматически после выхода из блока with.

s11kai: Поляков пишет: Хотя такой вариант (без закрытия), конечно, некрасивый и его следует избегать Именно это я и имел ввиду, например, существовала, команда goto, но использовать ее было как бы не "прилично", а не закрыл несколько раз открытый файл, стек переполнил - со всеми вытекающими, твои проблемы... Поляков пишет: при использовании некоторых конструкций в Python, например, with-as, файл закрывается автоматически после выхода из блока with А вот этого, к сожалению, я действительно не знал! Крайний вопрос, если можно. [pre2] with open("9.csv") as f: for s in f: s = s.split(";") print(s) [/pre2] Почему, к последнему элементу прилипает "\n" и как от него избавиться? ['37', '83', '24', '19', '37', '41\n'] ['59', '77', '43', '43', '118', '38\n'] ['6', '65', '40', '22', '6', '130\n'] Спасибо за науку, Константин Юрьевич!!!



полная версия страницы