Форум » Обработка целых чисел » Задачи 17.202 и 17.203 » Ответить

Задачи 17.202 и 17.203

Поляков: Павел С. пишет: [quote]"В файле 17-202.txt содержится последовательность целых чисел, которые принимают значения от -10000 до 10000 включительно. Тройка идущих подряд чисел последовательности называется уникальной, если только второе из них является положительным трёхзначным числом, заканчивающимся на 5. Определите количество уникальных троек чисел, а затем – максимальную из всех сумм таких троек." Словосочетание "только второе" явно указывает на то, что в массиве М, состоящем из трех числе чисел ТОЛЬКО ВТОРОЕ число должно быть трехзначным, быть > 0 и заканчиваться на 5. Из чего следует, что первое и третье НЕ должны быть таковыми. Другими словами "последовательности называется уникальной", только при соблюдении следующей логики: М[1] попадает под Условие И М[0] НЕ (попадает под Условие ) И М[2] НЕ (попадает под Условие) , где М - это массив из трех чисел; Условие - "должно быть положительным трёхзначным числом, заканчивающимся на 5"; Однако результат решения задачи совпадает с правильным, только при логике: М[1] попадает под Условие, М[0] И М[2] - ЛЮБОЕ ЧИСЛО;[/quote]Вот решение, у которого ответ совпадает с приведенным: [pre2] data = [int(x) for x in open('17-202.txt')] def cond(x): return 100 <= x < 1000 and x % 10 == 5 ma = 0 count = 0 for i in range(2,len(data)): if (not cond(data[i-2])) and cond(data[i-1]) and \ (not cond(data[ i])): count += 1 ma = max(ma, sum(data[i-2:i+1])) print( count, ma )[/pre2][quote]задача 203 демонстрирует ту же логическую ошибку[/quote]Вот решение задачи 203:[pre2]data = [int(x) for x in open('17-202.txt')] def cond(x): return 100 <= x < 1000 and x % 100 == 12 ma = 0 count = 0 for i in range(2,len(data)): if (not cond(data[i-2])) and cond(data[i-1]) and \ (not cond(data[ i])): count += 1 ma = max(ma, sum(data[i-2:i+1])) print( count, ma )[/pre2]

Ответов - 22, стр: 1 2 All

ivackov.sergey: ## var D:= ReadLines('17-202.txt').Select(t -> t.ToInteger).ToArray; var Trio:= D.NWise(3). Select(ar->ar.ToArray) .Where(ar->(ar[1] >0) and (ar[1] mod 10 = 5) and ((100<=ar[1]) and (ar[1]<=999))); Trio.Count.Print; Trio.Select(ar->ar[0]+ar[1]+ar[2]).Max.println;

ivackov.sergey: ## Assign(input, '17-202.txt'); var a := ReadInteger; var b := ReadInteger; var maxi := -100000; var count := 0; while not eof() do begin var c := ReadInteger; if (b > 0) and (b mod 100 =12) and b.Between(100, 999) then begin count+=1; var sum := a + b + c; maxi := max(maxi, sum); end; (a, b) := (b, c); end; count.print; maxi.println; //} // или //{ var D:= ReadLines('17-202.txt').Select(t -> t.ToInteger).ToArray; var Trio:= D.NWise(3). Select(ar->ar.ToArray) .Where(ar->(ar[1] >0) and (ar[1] mod 100 = 12) and (ar[1] in [100..999])); Trio.Count.Print; Trio.Select(ar->ar[0]+ar[1]+ar[2]).Max.println; //}

gk.aledar: Константин Юрьевич, позвольте с Вами не согласиться . Вот список троек чисел сформировавших ответ, указанный как правильный: 1 [-5986, 385, 4029] 2 [4029, 265, -8961] 3 [-9252, 565, 3533] 4 [7858, 395, 6516] 5 [-2981, 185, 5430] 6 [-8403, 115, 7598] 7 [-773, 305, 777] 8 [-8636, 825, 7158] 9 [-8043, 825, -405] 10 [1629, 255, 6264] 11 [-3506, 595, -4402] 12 [-3812, 605, -5017] 13 [4921, 715, 3511] 14 [5637, 395, 2042] 15 [1266, 695, 3020] 16 [-6107, 655, -9268] 17 [-6548, 255, 5536] 18 [-1832, 465, -9972] Если посмотреть на это список внимательно, то становиться очевидным, что не все из них попадают под ключевое условие задачи. Процитирую его еще раз: "Тройка идущих подряд чисел ..., если только второе из них является положительным трёхзначным числом, заканчивающимся на 5" 1. Очевидно, по под условие "...только второе из них является положительным трёхзначным числом..." попадают только тройки чисел с номерами 9,11,12,16,18 Соответственно правильным решением задачи является конструкция if (data[i-2] < 0) and cond(data[i-1]) and (data[ i] < 0) т.е ТОЛЬКО второе число является положительным, и подлежит дальнейшей проверке, а для отрицательных значений первого и последнего числа тройки остальные условия можно не проверять. Таким образом тройки чисел, которые должны формировать результат остаются: 9 [-8043, 825, -405] 11 [-3506, 595, -4402] 12 [-3812, 605, -5017] 16 [-6107, 655, -9268] 18 [-1832, 465, -9972] 2. При получении максимального значения, используется конструкция: m = 0; ... m = max(m, sum(...)) При ее использовании максимальный результат будет всегда больше нуля, хотя в условии задачи явно обозначено, что мы работаем с последовательностью целых чисел, которые принимают значения от -10000 до 10000. С учетом п.1 в последовательности может быть тройка: -10000, 5, -10000 Таким образом максимально возможное значение m = sum(-10000, 5, -10000) = -19995 Я считаю, что правильный ответ к задаче: 5 -7313 который сформирован из списка троек: 1 [-8043, 825, -405] 2 [-3506, 595, -4402] 3 [-3812, 605, -5017] 4 [-6107, 655, -9268] 5 [-1832, 465, -9972] полученных конструкцией if (data[i-2] < 0) and cond(data[i-1]) and (data < 0) и начальным значением m = -19995; PS: Обратите внимание, что если в текущем решении задачи заменить условие if (not cond(data[i-2])) and cond(data[i-1]) and (not cond(data)) на if cond(data[i-1]) мы получим тот же результат (18 14769), т.е значения data[i-2] и data могут быть любыми


Поляков: gk.aledar пишет: Соответственно правильным решением задачи является конструкция if (data[i-2] < 0) and cond(data[i-1]) and (data[ i] < 0), т.е ТОЛЬКО второе число является положительным, и подлежит дальнейшей проверке, а для отрицательных значений первого и последнего числа тройки остальные условия можно не проверять. В условии задачи такого нет. Это вы сами додумали.

gk.aledar: В условии задачи сказано: если только второе из них является положительным трёхзначным числом, заканчивающимся на 5

gk.aledar: те первое и третье число а) НЕ должно быть положительным; б) НЕ должно быть трехзначным; в) НЕ должно заканчиваться на 5

Поляков: gk.aledar пишет: те первое и третье число а) НЕ должно быть положительным; б) НЕ должно быть трехзначным; в) НЕ должно заканчиваться на 5 Боюсь, что вы неправильно понимаете закон де Моргана (отрицание конъюнкции).

gk.aledar: Константин Юрьевич, поясните пожалуйста

cabanov.alexey: НЕ (положительное И трёхзначное И должно оканчиваться на 5) = НЕ положительное ИЛИ НЕ трёхзначное ИЛИ НЕ оканчивается на 5

Поляков: В условии сказано, что второе число должно быть а) положительным, б) трехзначным и в) заканчиваться на 5. В тройке только второе число должно удовлетворять этому условию, остальные два не должны ему удовлетворять. Это ровно то, что написано у меня в программе. Можно записать по частям, используя закон де Моргана: not(a*b*c) = not a + not b + not c. Следовательно, для первого и третьего чисел в тройке не должно выполняться ХОТЯ БЫ ОДНО условие из а)-в): т.е. первое и третье число а) НЕ должно быть положительным ИЛИ б) НЕ должно быть трехзначным; ИЛИ в) НЕ должно заканчиваться на 5

gk.aledar: Я не могу этого объяснить так же красиво как Вы, но мне кажется, что тут есть несоответствие логике. Получается, что при прочих равных для второго числа должны быть соблюдены ВСЕ условия, а для первого и третьего может быть не соблюдено только одно из.

gk.aledar: Получается что проверка трех чисел происходит по разной формуле

cabanov.alexey: Получается, что при прочих равных для второго числа должны быть соблюдены ВСЕ условия, а для первого и третьего может быть не соблюдено только одно из. Да, всё верно. В чём по вашему несоответствие?

gk.aledar: Нет, Константин Юрьевич, позвольте все таки с Вами категорически не согласиться. Как Вы правильно заметили В условии сказано, что второе число должно быть а) положительным, б) трехзначным и в) заканчиваться на 5. В тройке только второе число должно удовлетворять этому условию, остальные два не должны ему удовлетворять. Далее автор задания (следуя устоявшимся парадигмам программирования по минимизации и изоляции кода), выносит проверку этого условия в отдельную функцию и получает: (Положительное И Трёхзначное И заканчивается на 5) - условие истинности для второго числа в тройке НЕ (Положительное И Трёхзначное И заканчивается на 5) - условие истинности для первого и третьего числа в тройке после чего применив закон де Моргана not(a*b*c) = not a + not b + not c получает железную, но не правильную логику: для второго числа ДОЛЖНЫ выполняться все ТРИ условия, а для первого и третьего НЕ ДОЛЖНО выполняться ХОТЯ БЫ ОДНО апеллируя к законом де Моргана пытаясь объяснить правильность СВОЕГО СПОСОБА проверки условия решения. Из условий же задачи: только второе из них является положительным трёхзначным числом, заканчивающимся на 5 можно сделать вывод, что для второго числа ДОЛЖНЫ выполняться ВСЕ ТРИ условия, а для первого и третьего ВСЕ ТРИ выполняться НЕ ДОЛЖНЫ. Таким образом логика решения, соответствующее формулировке задачи является (Положительное И Трёхзначное И заканчивается на 5) - условие истинности для второго числа в тройке (НЕ Положительное И НЕ Трёхзначное И НЕ заканчивается на 5) - условие истинности для первого и третьего числа в тройке Хотелось бы услышать Ваше мнение.

Поляков: gk.aledar пишет: Хотелось бы услышать Ваше мнение. Я высказал свое мнение, другого у меня нет. Вы имеете право иметь свое, конечно же.

gk.aledar: Информатика - это точная наука. Это не история. Тут не может быть двух мнений. trye - это всегда истина, а false - всегда ложь. Спрошу прямо: Вам не кажется, что это задание сформулировано так ,что на него сложно дать однозначное правильное решение?

Поляков: gk.aledar пишет: Вам не кажется, что это задание сформулировано так ,что на него сложно дать однозначное правильное решение? Нет, не кажется.

cabanov.alexey: Давайте ещё раз. только второе из них является положительным трёхзначным числом, заканчивающимся на 5 Даю вам 3 числа 1005 115 127 ВОПРОС - почему по вашему мнению эта тройка НЕ ПОДХОДИТ под это условие?

Елена0787: (№ 4419) (П. Финкель) В файле 17-199.txt содержится последовательность целых чисел, которые принимают значения от -10000 до 10000 включительно. Тройка идущих подряд чисел последовательности называется уникальной, если только второе из них является положительным двузначным нечётным числом. Определите количество уникальных троек чисел, а затем – максимальную из всех сумм таких троек. count=0 for i in range(2,len(s)): if not(int(s[i-2])%2==1 and 1000>int(s[i-2])>=100) and not(int(s)%2==1 and 1000>int(s)>=100) and (int(s[i-1])%2==1 and 1000>int(s[i-1])>=100 ): count+=1 print(count) выводит количество: 94 что не так? может в генераторе ответ неверный?

polyakovss: В условии задачи: ... если только второе из них является положительным двузначным нечётным числом.

smth000: подскажите, почему здесь: for i in range(2,len(data)) именно от двух?

Поляков: smth000 пишет: почему здесь: for i in range(2,len(data)) именно от двух? Потому что в теле цикла есть обращение к s[i-2].



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