Задание 15

Логические выражения

Типов: 6

01

Как распознать

Даны B, C и неизвестный отрезок A.

02

Условие

Найти минимальную длину A, чтобы формула с принадлежностью отрезкам была истинна для всех x.

03

Разбор

Проверяй концы отрезков и соседние точки.

04

Шаблон

template.py
def f(x):
    B = 36<=x<=75
    C = 60<=x<=110
    A = a1<=x<=a2
    return (not A) <= (B==C)
r = []
d = [y for x in (36,60,75,110) for y in (x,x-0.1,x+0.1)]
for a1 in d:
    for a2 in d:
        if all(f(x) == 1 for x in d) and a2>=a1:
            r += [a2-a1]
print(round(min(r)))
01

Как распознать

Формула содержит P, Q, A и две импликации.

02

Условие

Найти минимальную длину A для истинности формулы при всех x.

03

Разбор

Перебери пары критических границ.

04

Шаблон

template.py
def f(x):
    P = 17 <= x <= 58
    Q = 29 <= x <= 80
    A = a1 <= x <= a2
    return P <= ((Q and (not A)) <= (not P))
r = []
d = [y for x in (17, 29, 58, 80) for y in (x, x - 0.1, x + 0.1)]
for a1 in d:
    for a2 in d:
        if all(f(x) == 1 for x in d) and a2 >= a1:
            r += [a2 - a1]
print(round(min(r)))
01

Как распознать

В формуле есть отрезки и квадрат переменной.

02

Условие

Найти минимальную длину A; область x ограничена неотрицательными числами.

03

Разбор

Добавь к критическим точкам корень из границы неравенства.

04

Шаблон

template.py
def f(x):
    P = 52 <= x <= 105
    Q = 0 <= x <= 53
    A = a1 <= x <= a2
    return ((not P) and (not Q) and (not A)) <= (x ** 2 > 303601)
r = []
d = [y for x in (0, 52, 53, 105, 303601 ** 0.5) for y in (x, x - 0.1, x + 0.1) if y >= 0]
for a1 in d:
    for a2 in d:
        if a2 >= a1 and all(f(x) for x in d):
            r += [a2 - a1]
print(round(min(r)))
01

Как распознать

Параметр A участвует в выражении с операцией &.

02

Условие

Найти наименьшее A, при котором формула истинна для каждого x.

03

Разбор

Перебери A и достаточно широкий диапазон x.

04

Шаблон

template.py
def f(x, A):
    return ((x & 52 != 0) and (x & 48 == 0)) <= (not (x & A == 0))
print(min([A for A in range(0, 1000) if all(f(x, A) == 1 for x in range(0, 2000))]))
01

Как распознать

В условии дана функция делимости ДЕЛ(x, y).

02

Условие

Найти наибольшее A для истинности формулы при любом натуральном x.

03

Разбор

Реализуй ДЕЛ через остаток и перебери A.

04

Шаблон

template.py
def DEL(x, y):
    return x % y == 0
def f(x, A):
    return ((not DEL(x, 7)) and DEL(x, 13)) <= (x > A - 40)
print(max([A for A in range(1, 1000) if all(f(x, A) == 1 for x in range(1, 2000))]))
01

Как распознать

Формула содержит x, y и параметр A.

02

Условие

Найти минимальное A, при котором формула истинна для всех неотрицательных x и y.

03

Разбор

Полностью перебери разумные диапазоны A, x и y.

04

Шаблон

template.py
def f(x, y, A):
    return (x <= 19) or (y < 2 * x + A - 50) or (y > 17)
print(min([A for A in range(0, 200) if all(f(x, y, A) == 1 for x in range(0, 400) for y in range(0, 400))]))