Почему ответ не выводится?

Сколько существует целых значений числа A, при которых формула

((x < A) → (x^2 < 100)) ∧ ((y^2 ≤ 64) → (y ≤ A))

тождественно истинна при любых целых неотрицательных x и y?

Мой код:

for a in range(0,1000):
    f=True
    for x in range(1,100):
        for y in range(1,100):
            if ((not (x < a) or (x ** 2 < 100)) and (not(y ** 2 <= 64) or (y <= a))) == False:
                f=False
                if f == True:
                    print(a)

Я не вижу в нем ошибки


Ответы (2 шт):

Автор решения: S1NGer -iwni-

Для начала нужно сделать как-то так

count = 0
for a in range(0,1000):
    f=True
    for x in range(1,100):
        for y in range(1,100):
            if ((not (x < a) or (x ** 2 < 100)) and (not(y ** 2 <= 64) or (y <= a))) == False:
                if f == True:
                    count += 1
                    print(a)
                    f=False
print(count)

Но у тебя какие-то странные значения, почему ты выбрал такой диапазон, для А - 1000 и по 100 для x и y? Есть какое-то дополнительное условие?

→ Ссылка
Автор решения: Stanislav Volodarskiy

Поправить ваш код не сложно. Нужно исправить число пробелов в последних двух строках. Работает как задумано:

for a in range(0,1000):
    f=True
    for x in range(1,100):
        for y in range(1,100):
            if ((not (x < a) or (x ** 2 < 100)) and (not(y ** 2 <= 64) or (y <= a))) == False:
                f=False
    if f == True:
        print(a)

Некоторые доработки. Вы знаете логику, значит поймёте пару правил:

expr == False    ->    not expr
expr == True     ->        expr

Правила применимы только если expr имеет булев тип. Так что ещё правило: избегайте неявного приведения выражений другого типа к булеву.

Следующее правило: все операторы в коде одного уровня абстракции. Сейчас не так: смешано вычисление f (низкий уровень), проверка и печать (высокий уровень). Прячем вычисление:

def check(a):
    f=True
    for x in range(1,100):
        for y in range(1,100):
            if not ((not (x < a) or (x ** 2 < 100)) and (not(y ** 2 <= 64) or (y <= a))):
                f=False
    return f


for a in range(0,1000):
    if check(a):
        print(a)

Оптимизация: если единственное действие цикла присвоение константы, прерываем цикл немедленно. Функция check делает единственное действие, выходим из неё быстро:

def check(a):
    for x in range(1,100):
        for y in range(1,100):
            if not ((not (x < a) or (x ** 2 < 100)) and (not(y ** 2 <= 64) or (y <= a))):
                return False
    return True

Бизнес логика смешана с вычислениями. Разделяем:

def formula(a, x, y):
    # ((x < A) → (x^2 < 100)) ∧ ((y^2 ≤ 64) → (y ≤ A))
    return (not (x < a) or (x ** 2 < 100)) and (not (y ** 2 <= 64) or (y <= a))


def check(a):
    for x in range(1,100):
        for y in range(1,100):
            if not formula(a, x, y):
                return False
    return True

Знай и люби библиотеку языка. all проверяет что все элементы истинны:

def check(a):
    return all(
        formula(a, x, y)
        for x in range(1,100)
        for y in range(1,100)
    )

Всё вместе:

def formula(a, x, y):
    # ((x < A) → (x^2 < 100)) ∧ ((y^2 ≤ 64) → (y ≤ A))
    return (not (x < a) or (x ** 2 < 100)) and (not (y ** 2 <= 64) or (y <= a))


def check(a):
    return all(
        formula(a, x, y)
        for x in range(1, 100)
        for y in range(1, 100)
    )


for a in range(1000):
    if check(a):
        print(a)
$ time python formula.py
8
9
10

real  0m0.552s
user  0m0.548s
sys   0m0.000s
→ Ссылка