Ваша задача написать некоторый код на Python 2 или 3 такой, что это выражение:
(a+b)(c+d) == a*c + b*c + a*d + b*d
оценивать True
без каких-либо исключений.
Чтобы уточнить, я скопирую ваш код в файл, а затем from
в файл import *
. Затем я введу выражение в консоль и проверим, что оно есть True
.
Это код-гольф, поэтому выигрывает ответ с самой короткой длиной (в байтах).
0 .__mul__
для ,lambda y:0
но это та же самая длина.x.count
сохраняет байт.type(t(), t())
илиt().type(t())
выдает исключение, так что происходит, когда вы делаетеt() + t()
?__add__
вызывается с двумя, но первый интерпретируется какself
, толькоother
передаетсяtype
. Странно даa + b
первая попыткаa.__add__(b)
.a.__add__
естьtype
, так что становитсяtype(b)
. Основное различие между этим и обычным случаями для методов заключается в том, что обычноa.__add__
это будет объект, отличный от того, который вы задали__add__
в определении класса, из-за протокола дескриптора , который реализуют обычные объекты функций. (Есть также несколько других хитрых54 байта
Создайте объект, который наследуется
int
, кроме добавления или вызова, просто возвращает свою копию.Одинаковая длина:
Я думал
min
или{}.get
буду работать вместоlambda a,b:a
, но по какой-то причине они действуют только на второй аргумент.источник
min
уже имеет__self__
атрибут, поэтому класс пропускает привязку самого себя. Почемуmin
есть__self__
еще один вопрос ...min
имеет__self__
.min.__self__
это просто артефакт того, как встроенные функции и встроенные методы реализованы как один и тот же тип.min
здесь не работает, потому что в отличие от функций, написанных на Python, встроенные функции не поддерживают протокол дескриптора, который отвечает за привязку первого аргумента.8166 байтисточник
68 байт
Хотя он не может реально конкурировать с существующими ответами, на самом деле он выполняет соответствующие вычисления:
Объяснение:
sympy.abc
содержит все односимвольные символы, в частности , из них названыa
,b
,c
, иd
.a+b
этоAdd
объект, который представляет общую сумму.type(a+b).__call__= […]
Обезьяна-патчиAdd
класса, чтобы дать ему возможности оценки, в этом случае позволяет ему работать как умножение вызывающего и вызываемого.expand
необходимо сделать выражения фактически равными (поскольку SymPy выполняет только тщательные проверки на равенство по требованию).источник