FOIL Python сильная печать!

35

Ваша задача написать некоторый код на Python 2 или 3 такой, что это выражение:

(a+b)(c+d) == a*c + b*c + a*d + b*d

оценивать Trueбез каких-либо исключений.

Чтобы уточнить, я скопирую ваш код в файл, а затем fromв файл import *. Затем я введу выражение в консоль и проверим, что оно есть True.

Это код-гольф, поэтому выигрывает ответ с самой короткой длиной (в байтах).

Esolanging Fruit
источник

Ответы:

20

54 52 50 49 48 45 39 байт

Удалено 4 байта благодаря Денису.

Последняя версия вдохновлена ​​«некоторой причиной» в ответе xnor.

class t(int):__add__=type
a=b=t()
c=d=0
jimmy23013
источник
Ницца! Там же 0 .__mul__для , lambda y:0но это та же самая длина.
xnor
x.countсохраняет байт.
Деннис
1
Я не понимаю ... type(t(), t())или t().type(t())выдает исключение, так что происходит, когда вы делаете t() + t()?
feersum
1
@feersum __add__вызывается с двумя, но первый интерпретируется как self, только otherпередается type. Странно да
Джонатан Аллан
1
@feersum: a + bпервая попытка a.__add__(b). a.__add__есть type, так что становится type(b). Основное различие между этим и обычным случаями для методов заключается в том, что обычно a.__add__это будет объект, отличный от того, который вы задали __add__в определении класса, из-за протокола дескриптора , который реализуют обычные объекты функций. (Есть также несколько других хитрых
моментов,
10

54 байта

class m(int):__call__=__add__=lambda*x:m()
a=b=c=d=m()

Создайте объект, который наследуется int, кроме добавления или вызова, просто возвращает свою копию.

Одинаковая длина:

class m(int):__call__=__add__=lambda a,b:a
a=b=c=d=m()

Я думал minили {}.getбуду работать вместо lambda a,b:a, но по какой-то причине они действуют только на второй аргумент.

XNOR
источник
1
(это код-гольф )
Эддисон Крамп
1
Ой, я только видел программирование-пазл , будет гольф.
xnor
3
Это было довольно сокращение oO
Аддисон Крамп
@xnor Это не работает, потому что minуже имеет __self__атрибут, поэтому класс пропускает привязку самого себя. Почему minесть __self__еще один вопрос ...
matsjoyce
@matsjoyce: Нет, это не имеет ничего общего с тем, что minимеет __self__. min.__self__это просто артефакт того, как встроенные функции и встроенные методы реализованы как один и тот же тип. minздесь не работает, потому что в отличие от функций, написанных на Python, встроенные функции не поддерживают протокол дескриптора, который отвечает за привязку первого аргумента.
user2357112 поддерживает Monica
3

81 66 байт

class e:__mul__=lambda*o:0;__add__=lambda*o:lambda x:0
a=b=c=d=e()
Джонатан Аллан
источник
1

68 байт

Хотя он не может реально конкурировать с существующими ответами, на самом деле он выполняет соответствующие вычисления:

from sympy.abc import*
type(a+b).__call__=lambda x,y:(x*y).expand()

Объяснение:

  • SymPy - это модуль для символьных вычислений.
  • sympy.abcсодержит все односимвольные символы, в частности , из них названы a, b, c, и d.
  • a+bэто Addобъект, который представляет общую сумму.
  • type(a+b).__call__= […]Обезьяна-патчи Addкласса, чтобы дать ему возможности оценки, в этом случае позволяет ему работать как умножение вызывающего и вызываемого.
  • expand необходимо сделать выражения фактически равными (поскольку SymPy выполняет только тщательные проверки на равенство по требованию).
Wrzlprmft
источник