FOIL Python的强类型!


35

您的任务是用Python 2或3编写一些代码,使该表达式如下:

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

将评估为,True而不会引发任何异常。

为了澄清,我将您的代码复制到一个文件中,然后复制到from该文件中import *。然后,将表达式输入控制台,并确认它是True

这是代码高尔夫球,因此长度最短(以字节为单位)的答案会获胜。

Answers:


20

54 52 50 49 48 45 39个字节

多亏了丹尼斯,删除了4个字节。

最新版本受xnor回答中的“某些原因”启发。

class t(int):__add__=type
a=b=t()
c=d=0

真好!有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__在类定义中设置的对象不同。(这里还有一些其他不相关的棘手位。)
user2357112支持Monica 16'Oct

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,但由于某些原因,它们仅对第二个论点起作用。



1
糟糕,我只看到程序设计难题,就会打高尔夫球。
xnor

3
这真是一种降低
艾迪生·克伦普

@xnor因为min已经具有__self__属性,所以它不起作用,因此该类将跳过绑定其自身的自身。为什么min还有__self__另一个问题...
matsjoyce 16-10-29

@matsjoyce:不,它没有什么关系的事实min__self__min.__self__只是关于如何将内置函数和内置方法实现为同一类型的产物。min在这里不起作用,因为与用Python编写的函数不同,内置函数不支持描述符协议,该协议负责绑定第一个参数。
user2357112支持Monica


1

68个字节

尽管它不能与现有答案真正竞争,但实际上它执行了有问题的计算:

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

说明:

  • SymPy是用于符号计算的模块。
  • sympy.abc包含了所有的单字母符号,在名为特定的人abc,和d
  • a+b是一个Add对象,代表一个总和。
  • type(a+b).__call__= […]猴子修补Add类,使其具有评估功能,在这种情况下,使其能够像调用方和被调用方的乘法一样工作。
  • expand 必须使表达式实际上相等(因为SymPy仅按需执行彻底的相等检查)。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.