Автор | Сообщение |
|
| Администратор
|
Сообщение: 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 пишет: цитата: | Хотелось бы услышать Ваше мнение. |
|
Я высказал свое мнение, другого у меня нет. Вы имеете право иметь свое, конечно же.
|
|
|
|
Отправлено: 19.10.21 17:13. Заголовок: Информатика - это то..
Информатика - это точная наука. Это не история. Тут не может быть двух мнений. trye - это всегда истина, а false - всегда ложь. Спрошу прямо: Вам не кажется, что это задание сформулировано так ,что на него сложно дать однозначное правильное решение?
|
|
|
|
| Администратор
|
Сообщение: 2966
|
|
Отправлено: 19.10.21 17:17. Заголовок: gk.aledar пишет: Вам..
gk.aledar пишет: цитата: | Вам не кажется, что это задание сформулировано так ,что на него сложно дать однозначное правильное решение? |
|
Нет, не кажется.
|
|
|
|
Отправлено: 19.10.21 19:22. Заголовок: Давайте ещё раз. тол..
Давайте ещё раз. цитата: | только второе из них является положительным трёхзначным числом, заканчивающимся на 5 |
| Даю вам 3 числа 1005 115 127 ВОПРОС - почему по вашему мнению эта тройка НЕ ПОДХОДИТ под это условие?
|
|
|
|
Отправлено: 14.11.21 13:22. Заголовок: № 4419 не сходится ответ
(№ 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 что не так? может в генераторе ответ неверный?
|
|
|
|
Отправлено: 14.11.21 14:58. Заголовок: Ответ
В условии задачи: цитата: | ... если только второе из них является положительным двузначным нечётным числом. |
|
|
|
|
|
Отправлено: 15.09.22 18:41. Заголовок: подскажите, почему з..
подскажите, почему здесь: for i in range(2,len(data)) именно от двух?
|
|
|
|
|
| Администратор
|
Сообщение: 3687
|
|
Отправлено: 16.09.22 13:33. Заголовок: smth000 пишет: почем..
smth000 пишет: цитата: | почему здесь: for i in range(2,len(data)) именно от двух? |
|
Потому что в теле цикла есть обращение к s[i-2].
|
|
|
Ответов - 22
, стр:
1
2
All
[только новые]
|
|