あなたのタスクは、Python 2または3で次のような式を作成することです。
(a+b)(c+d) == a*c + b*c + a*d + b*d
True
例外を発生させることなく評価されます。
明確にするために、コードをファイルにコピーしてから、ファイルにコピーfrom
しますimport *
。次に、コンソールに式を入力し、それがであることを確認しTrue
ます。
これはコードゴルフなので、最短の長さ(バイト単位)の答えが優先されます。
あなたのタスクは、Python 2または3で次のような式を作成することです。
(a+b)(c+d) == a*c + b*c + a*d + b*d
True
例外を発生させることなく評価されます。
明確にするために、コードをファイルにコピーしてから、ファイルにコピーfrom
しますimport *
。次に、コンソールに式を入力し、それがであることを確認しTrue
ます。
これはコードゴルフなので、最短の長さ(バイト単位)の答えが優先されます。
回答:
Dennisのおかげで4バイト削除されました。
最新バージョンは、xnorの回答の「何らかの理由」に触発されています。
class t(int):__add__=type
a=b=t()
c=d=0
x.count
バイトを保存します。
type(t(), t())
またはt().type(t())
例外をスローしt() + t()
ます。
__add__
は2で呼び出されますが、最初のものはと解釈されself
、のみother
に渡されtype
ます。奇妙な、はい。
a + b
最初の試行a.__add__(b)
。a.__add__
ですtype
、それはになりtype(b)
ます。この場合とメソッドの通常の場合の主な違いは、通常の関数オブジェクトが実装する記述子プロトコルにより、通常、クラス定義でa.__add__
設定__add__
したものとは異なるオブジェクトになることです。(ここには関係ない他のいくつかのトリッキーなビットもあります。)
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
が、何らかの理由で、彼らは唯一の第二引数に作用します。
min
すでに__self__
属性があるため機能しません。そのため、クラスは自身のバインドをスキップします。なぜ別の質問min
が__self__
あるのか
min
は何の関係もありません__self__
。min.__self__
は、組み込み関数と組み込みメソッドが同じ型としてどのように実装されるかの成果物にすぎません。min
Pythonで記述された関数とは異なり、組み込み関数は記述子プロトコルをサポートしていないため、ここでは機能しません。記述子プロトコルは、最初の引数のバインドを担当します。
実際に既存の回答と競合することはできませんが、これは実際に問題の計算を実行します。
from sympy.abc import*
type(a+b).__call__=lambda x,y:(x*y).expand()
説明:
sympy.abc
すべての単一文字記号が含まれている、という名前の特定のものでa
、b
、c
、とd
。a+b
あるAdd
一般的な和を表すオブジェクトは、。type(a+b).__call__= […]
サルは、パッチAdd
の呼び出し元と呼び出し先の乗算のような作品にそれを可能にするこのような場合には、それを評価能力を与えるためにクラスを。expand
式を実際に等しくするために必要です(SymPyはオンデマンドで徹底的な等価性チェックのみを実行するため)。
0 .__mul__
のためにlambda y:0
、それは同じ長さです。