Автор | Сообщение |
|
| Администратор
|
Сообщение: 2955
|
|
Отправлено: 18.10.21 21:10. Заголовок: Задачи 17.202 и 17.203
Павел С. пишет: цитата: | "В файле 17-202.txt содержится последовательность целых чисел, которые принимают значения от -10000 до 10000 включительно. Тройка идущих подряд чисел последовательности называется уникальной, если только второе из них является положительным трёхзначным числом, заканчивающимся на 5. Определите количество уникальных троек чисел, а затем – максимальную из всех сумм таких троек." Словосочетание "только второе" явно указывает на то, что в массиве М, состоящем из трех числе чисел ТОЛЬКО ВТОРОЕ число должно быть трехзначным, быть > 0 и заканчиваться на 5. Из чего следует, что первое и третье НЕ должны быть таковыми. Другими словами "последовательности называется уникальной", только при соблюдении следующей логики: М[1] попадает под Условие И М[0] НЕ (попадает под Условие ) И М[2] НЕ (попадает под Условие) , где М - это массив из трех чисел; Условие - "должно быть положительным трёхзначным числом, заканчивающимся на 5"; Однако результат решения задачи совпадает с правильным, только при логике: М[1] попадает под Условие, М[0] И М[2] - ЛЮБОЕ ЧИСЛО; |
|
Вот решение, у которого ответ совпадает с приведенным: 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 ) цитата: | задача 203 демонстрирует ту же логическую ошибку |
|
Вот решение задачи 203: 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 )
| |
|
Ответов - 22
, стр:
1
2
All
[только новые]
|
|
|
Отправлено: 18.10.21 23:51. Заголовок: Решение 202 на PascalABC
## 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;
| |
|
|
Отправлено: 18.10.21 23:52. Заголовок: Решение 203 на PascalABC
## 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; //}
| |
|
|
Отправлено: 19.10.21 12:15. Заголовок: Константин Юрьевич, ..
Константин Юрьевич, позвольте с Вами не согласиться . Вот список троек чисел сформировавших ответ, указанный как правильный: 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 могут быть любыми
| |
|
|
| Администратор
|
Сообщение: 2960
|
|
Отправлено: 19.10.21 12:23. Заголовок: gk.aledar пишет: Соо..
gk.aledar пишет: цитата: | Соответственно правильным решением задачи является конструкция if (data[i-2] < 0) and cond(data[i-1]) and (data[ i] < 0), т.е ТОЛЬКО второе число является положительным, и подлежит дальнейшей проверке, а для отрицательных значений первого и последнего числа тройки остальные условия можно не проверять. |
|
В условии задачи такого нет. Это вы сами додумали.
| |
|
|
Отправлено: 19.10.21 12:27. Заголовок: В условии задачи ска..
В условии задачи сказано: цитата: | если только второе из них является положительным трёхзначным числом, заканчивающимся на 5 |
|
| |
|
|
Отправлено: 19.10.21 12:30. Заголовок: те первое и третье ч..
те первое и третье число а) НЕ должно быть положительным; б) НЕ должно быть трехзначным; в) НЕ должно заканчиваться на 5
| |
|
|
| Администратор
|
Сообщение: 2961
|
|
Отправлено: 19.10.21 12:31. Заголовок: gk.aledar пишет: те ..
gk.aledar пишет: цитата: | те первое и третье число а) НЕ должно быть положительным; б) НЕ должно быть трехзначным; в) НЕ должно заканчиваться на 5 |
|
Боюсь, что вы неправильно понимаете закон де Моргана (отрицание конъюнкции).
| |
|
|
Отправлено: 19.10.21 12:41. Заголовок: Константин Юрьевич, ..
Константин Юрьевич, поясните пожалуйста
| |
|
|
Отправлено: 19.10.21 12:48. Заголовок: НЕ (положительное И ..
НЕ (положительное И трёхзначное И должно оканчиваться на 5) = НЕ положительное ИЛИ НЕ трёхзначное ИЛИ НЕ оканчивается на 5
| |
|
|
| Администратор
|
Сообщение: 2962
|
|
Отправлено: 19.10.21 12:49. Заголовок: В условии сказано, ч..
В условии сказано, что второе число должно быть а) положительным, б) трехзначным и в) заканчиваться на 5. В тройке только второе число должно удовлетворять этому условию, остальные два не должны ему удовлетворять. Это ровно то, что написано у меня в программе. Можно записать по частям, используя закон де Моргана: not(a*b*c) = not a + not b + not c. Следовательно, для первого и третьего чисел в тройке не должно выполняться ХОТЯ БЫ ОДНО условие из а)-в): т.е. первое и третье число а) НЕ должно быть положительным ИЛИ б) НЕ должно быть трехзначным; ИЛИ в) НЕ должно заканчиваться на 5
| |
|
|
Отправлено: 19.10.21 13:35. Заголовок: Я не могу этого объя..
Я не могу этого объяснить так же красиво как Вы, но мне кажется, что тут есть несоответствие логике. Получается, что при прочих равных для второго числа должны быть соблюдены ВСЕ условия, а для первого и третьего может быть не соблюдено только одно из.
| |
|
|
|
Отправлено: 19.10.21 13:39. Заголовок: Получается что прове..
Получается что проверка трех чисел происходит по разной формуле
| |
|
|
Отправлено: 19.10.21 15:47. Заголовок: Получается, что при ..
цитата: | Получается, что при прочих равных для второго числа должны быть соблюдены ВСЕ условия, а для первого и третьего может быть не соблюдено только одно из. |
| Да, всё верно. В чём по вашему несоответствие?
| |
|
|
Отправлено: 19.10.21 16:46. Заголовок: Нет, Константин Юрье..
Нет, Константин Юрьевич, позвольте все таки с Вами категорически не согласиться. Как Вы правильно заметили цитата: | В условии сказано, что второе число должно быть а) положительным, б) трехзначным и в) заканчиваться на 5. В тройке только второе число должно удовлетворять этому условию, остальные два не должны ему удовлетворять. |
| Далее автор задания (следуя устоявшимся парадигмам программирования по минимизации и изоляции кода), выносит проверку этого условия в отдельную функцию и получает: (Положительное И Трёхзначное И заканчивается на 5) - условие истинности для второго числа в тройке НЕ (Положительное И Трёхзначное И заканчивается на 5) - условие истинности для первого и третьего числа в тройке после чего применив закон де Моргана цитата: | not(a*b*c) = not a + not b + not c |
| получает железную, но не правильную логику: для второго числа ДОЛЖНЫ выполняться все ТРИ условия, а для первого и третьего НЕ ДОЛЖНО выполняться ХОТЯ БЫ ОДНО апеллируя к законом де Моргана пытаясь объяснить правильность СВОЕГО СПОСОБА проверки условия решения. Из условий же задачи: цитата: | только второе из них является положительным трёхзначным числом, заканчивающимся на 5 |
| можно сделать вывод, что для второго числа ДОЛЖНЫ выполняться ВСЕ ТРИ условия, а для первого и третьего ВСЕ ТРИ выполняться НЕ ДОЛЖНЫ. Таким образом логика решения, соответствующее формулировке задачи является (Положительное И Трёхзначное И заканчивается на 5) - условие истинности для второго числа в тройке (НЕ Положительное И НЕ Трёхзначное И НЕ заканчивается на 5) - условие истинности для первого и третьего числа в тройке Хотелось бы услышать Ваше мнение.
| |
|
|
| Администратор
|
Сообщение: 2965
|
|
Отправлено: 19.10.21 16:49. Заголовок: gk.aledar пишет: Хот..
gk.aledar пишет: цитата: | Хотелось бы услышать Ваше мнение. |
|
Я высказал свое мнение, другого у меня нет. Вы имеете право иметь свое, конечно же.
| |
|
Ответов - 22
, стр:
1
2
All
[только новые]
|
|
|