Автор | Сообщение |
|
Отправлено: 10.05.23 14:39. Заголовок: Линия 15. Задача 6158. ошибка в ответе
(№ 6158) (Д. Статный) Обозначим через ДЕЛ(n, m) утверждение «натуральное число n делится без остатка на натуральное число m». На числовой прямой даны три отрезка: P = [257, 356], Q = [5, 600] и R = [59, 228]. Какова минимальная длина отрезка A, при котором формула ((x ∈ R) → (x ∈ A)) ∨ ((ДЕЛ(x, 3) → (x ∈ P)) → ((x ∈ Q) → (x ∈ A))) тождественно истинна, то есть принимает значение 1 при любом натуральном значении переменной х? Авторский ответ: 169 Правильный ответ: 168 - Отрезок [59, 227]
|
 |

|
Ответов - 14
[только новые]
|
|
|
Отправлено: 14.05.23 16:35. Заголовок: № 6158
import sys sys.setrecursionlimit (10000) def F(a, b, x): if a <= x <=b: return True mn=10**9 for a in range(800): for b in range(a, 800): Rezult=1 for x in range(800): Rezult*=(not (F(59, 228, x))) or F(a, b, x) or (x%3==0) and (not (F(257, 356, x))) or (not (F(5, 600, x))) if Rezult: mn=min(mn, b-a) print(mn) ответ 168. Может где ошибка?
|
 |
|
|
| Администратор
|
Сообщение: 3957
|
|
Отправлено: 15.05.23 12:30. Заголовок: Max-xaM пишет: Прави..
Max-xaM пишет: цитата: | Правильный ответ: 168 - Отрезок [59, 227] |
|
Доказывайте.
|
 |

|
|
Отправлено: 15.05.23 13:16. Заголовок: Проверяем отрезок А=..
Х может быть только натуральным числом, никаких нецелых. Иначе формула на делимость не определена. Проверяем отрезок А= [59,227] программно: ## var (p,q,r,a):=(257..356, 5..600, 59..228, 59..227); for var x:=1 to 70000 do if ( ((x in r) <= (x in a)) or ((x.Divs(3) <= (x in p)) <= ((x in q) <= (x in a))) ) = false then print(x); Ни один из Х от 1 до 70000 не срабатывает на ложь - везде правда.
|
 |

|
|
Отправлено: 15.05.23 16:27. Заголовок: №6158
def F(a, b, x): if a <= x <=b: return True mn=10**9 for a in range(800): for b in range(a, 800): Rezult=1 for x in range(800): Rezult*=(not (F(59, 228, x))) or F(a, b, x) or (x%3==0) and \ (not (F(257, 356, x))) or (not (F(5, 600, x))) if Rezult: mn=min(mn, b-a) print(mn)
|
 |
|
|
Отправлено: 16.05.23 13:20. Заголовок: ENL пишет: def F(a,..
ENL пишет: цитата: | def F(a, b, x): if a <= x <=b: return True mn=10**9 for a in range(800): for b in range(a, 800): Rezult=1 for x in range(800): Rezult*=(not (F(59, 228, x))) or F(a, b, x) or (x%3==0) and \ (not (F(257, 356, x))) or (not (F(5, 600, x))) if Rezult: mn=min(mn, b-a) print(mn) |
| Спасибо за правильно отформатированный код! Вот, теперь с вашей программой сможет разобраться любой "жаждущий" форумчанин!
|
 |

|
|
Отправлено: 16.05.23 11:00. Заголовок: Граница отрезка НЕ м..
Граница отрезка НЕ может быть НЕцелым числом - иначе функция НЕ определена. Об этом даже написано в самой задаче: " принимает значение 1 при любом натуральном значении переменной х " Нельзя для проверки брать НЕцелые числа Х. Верный ответ 168 Программа проверки "ЛЮБОГО" Х для отрезка 59-227 написана выше. Ваш ответ - 168,(9) является числом БОЛЬШЕ, чем 168 Так что МИНИМАЛЬНАЯ длина - 168
|
 |

|
|
| Администратор
|
Сообщение: 3958
|
|
Отправлено: 16.05.23 11:24. Заголовок: Да, там ответ 168. С..
Да, там ответ 168. Спасибо за обсуждение, ответ исправлен. Число 228 перекрывается условием ДЕЛ(x,3) and not (x in P).
|
 |

|
|
Отправлено: 16.05.23 12:53. Заголовок: Поляков пишет: Да, ..
Поляков пишет: from itertools import * def f(x): p = 257<=x<=356 q = 5<=x<=600 r = 59<=x<=228 a = a1<=x<=a2 return (r <= a)or(((x%3) <= p) <= (q <= a)) ox = [i/4 for i in range(4*4,601*4)] m = [] for a1,a2 in range(combinations(ox,2)): if all(f(x) == 1 for x in ox): m.append(round(a2-a1)) print(min(m)) Данная программа написана по идее А.Кабанова и дает ответ 169, кто сможет пояснить в чем ошибка? 
|
 |

|
|
| Администратор
|
Сообщение: 3959
|
|
Отправлено: 16.05.23 13:03. Заголовок: s11kai пишет: Данная..
s11kai пишет: цитата: | Данная программа написана по идее А.Кабанова и дает ответ 169, кто сможет пояснить в чем ошибка? |
|
Ошибкв в том, что эта программа проверяет не только целые значения x. А по условию они только целые.
|
 |

|
|
Отправлено: 17.05.23 02:49. Заголовок: Поляков пишет: Ошиб..
Поляков пишет: цитата: | Ошибка в том, что эта программа проверяет не только целые значения x. А по условию они только целые |
| И, все-же, данный алгоритм можно использовать, только, с учетом условия - не разбивать отрезки на интервалы! def f(x): p = 257<=x<=356 q = 5<=x<=600 r = 59<=x<=228 a = a1<=x<=a2 return (r <= a)or(((x%3 == 0) <= p) <= (q <= a)) ox = [i for i in range(5,600)] m = [] for a1,a2 in combinations(ox,2): if all(f(x) == 1 for x in ox): m.append(a2-a1) print(min(m)) 1. Данный алгоритм выполняется примерно в 10 раз быстрее, т.е. 20 с., по сравнению с алгоритмами имеющими вложенные циклы - 200 c. 2. Сложность расстановки приоритетов при составлении условия 3. Универсальность. Эта программа позволяет работать при любых значениях переменной х, а не только с целыми значениями x.
|
 |

|
|
Отправлено: 16.05.23 11:54. Заголовок: Не знаю, как прикреп..
|
 |

|
|
|
Отправлено: 17.05.23 04:05. Заголовок: Max-xaM пишет: Зали..
Max-xaM пишет: Интересное решение, вот код, строящий итоговою таблицу истинности для описанного способа: print('P Q R X A F') k = 0 for p in range(2): for q in range(2): for r in range(2): for x in range(2): for a in range(2): f = ((r<=a)or((x<=p)<=(q<=a))) if (f == False) and (k == 0): k+=1 if (f == True) and (k == 1): k = 0 print(p,q,r,x,a,int(f)) При желании, ее можно составить и в Excel_e
|
 |

|
|
Отправлено: 16.05.23 13:03. Заголовок: вот аналогичная зада..
Поляков пишет: цитата: | Ошибкв в том, что эта программа проверяет не только целые значения x. А по условию они только целые |
| Вот аналогичная задача 361 из генератора, она без round выдает так-же дробный ответ 12,75, можно предположить , что правильным будет ответ не 13, а 12? (№ 361) На числовой прямой даны два отрезка: P=[2,20] и Q=[15,25]. Какова минимальная длина отрезка A, такого, что формула ((x ∉ А) → (x ∉ P) ) ∨ (x ∈ Q) тождественно истинна, то есть принимает значение 1 при любом значении переменной х? from itertools import * def f(x): P = 2<=x<=20 Q = 15<=x<=25 R = 59<=x<=228 A = a1<=x<=a2 return ((not A)<=(not P)) or Q ox = [i/4 for i in range(1*4,26*4)] m = [] for a1,a2 in combinations(ox,2): if all(f(x) == 1 for x in ox): m.append(a2-a1) print(min(m)) Спасибо!
|
 |

|
|
Отправлено: 16.05.23 13:11. Заголовок: s11kai пишет: то ес..
Хотя, действительно, там сказано - при любом значении переменной х Спасибо за науку!
|
 |

|
|