Задача
На числовой прямой даны два отрезка: D = [17; 58] и C = [29; 80]. Укажите наименьшую возможную длину такого отрезка A, для которого логическое выражение
истинно (т.е. принимает значение 1) при любом натуральном значении переменной х?
Решение (аналитическое)
Введем следующие обозначения:
Перепишем выражение в введенных обозначениях:
Упростим выражение:
Выражение должно быть тождественно истинно. Ключевым моментом в этой задаче является следующий факт:
Таким образом:
Для того, чтобы найти А необходимо инвертитовать 0. По закону Де-Моргана получим:
Отразим на числовой прямой промежутки, соответствующие полученному решению. Сначала ¬С:
Теперь D:
Теперь сопоставим их межу собой. Пересечение и будет являться отрезком А:
Таким образом, А соответствует отрезок [17; 29], его длина - 12 (29 - 17 = 12).
Ответ: 12.
Решение (программа)
Дело обстоит в том, что мы имеем дело с множествами. Именно по этому нам необходимо написать программу именно используя это обстоятельство.
Перед тем, как приступить к написанию программы, необходимо упростить исходное логическое выражение:
Выражение должно быть тождественно истинно. Ключевым моментом в этой задаче является следующий факт:
Таким образом:
Для того, чтобы найти А необходимо инвертитовать 0. По закону Де-Моргана получим:
Постараемся интерпретировать полученный результат. Элементы множества А это такие элементы, которые есть в множестве D:
i in D
и их нет в множестве C:
i not in C
Перейдем к программированию.
В языке программирования Python мы можем создать множество путем передачи всех элементов множества внутри фигурных скобок {} и разделить элементы при помощи запятых (,). Множество может содержать любое количество элементов и элементы могут быть разных типов, к примеру, целые числа, строки, кортежи, и т. д.
Создадим три множества - A, C и D:
A = set()
C = set()
D = set()
Добавим в множества C и D значения в соответствии с условием:
for i in range(17,59):
D.add(i)
for i in range(29,81):
C.add(i)
Далее в цикле будем перебирать значения в диапазоне [1, 501]. Если эти значения буду соответствовать условию (есть в множестве D и их нет в множестве C), то будем добавлять их в множество А:
for i in range(1,501):
if (i in D) and (i not in C):
A.add(i)
В результате работы цикла будет сформировано множество А, которое соответствует решению - наименьший возможный отрезок. Остается вывести его длину.
print(len(A))
В целом программа будет иметь следующий вид:
A = set()
C = set()
D = set()
for i in range(17,59):
D.add(i)
for i in range(29,81):
C.add(i)
for i in range(1,501):
if (i in D) and (i not in C):
A.add(i)
print(len(A))
Ответ: 12.
P.S.
Стоит отметить, что для решения данной задачи можно и не упрощать исходное логическое выражение, необходимо лишь избавиться от следования. Основной момент - быть внимательным, т.к. мы работаем с множествами.
Так же ситуация отличается тем, что мы проверяем, ложно ли логическое выражение. Если логическое выражение ложно, то выбранное значение x добавляем в множество А.
Теперь запишем это на языке программирования:
not((x not in D) or (not(x not in C and x not in A) or x not in D))
Полная программа выглядит следующим образом:
A = set()
C = set()
D = set()
for i in range(17,59):
D.add(i)
for i in range(29,81):
C.add(i)
for x in range(1,500):
if not((x not in D) or (not(x not in C and x not in A) or x not in D)):
A.add(x)
print(len(A))