FOIL Pythonの強力な型付け!


35

あなたのタスクは、Python 2または3で次のような式を作成することです。

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

True例外を発生させることなく評価されます。

明確にするために、コードをファイルにコピーしてから、ファイルにコピーfromしますimport *。次に、コンソールに式を入力し、それがであることを確認しTrueます。

これはコードゴルフなので、最短の長さ(バイト単位)の答えが優先されます。

回答:


20

54 52 50 49 48 45 39バイト

Dennisのおかげで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__は2で呼び出されますが、最初のものはと解釈されself、のみotherに渡されtypeます。奇妙な、はい。
ジョナサンアラン

1
@feersum:a + b最初の試行a.__add__(b)a.__add__ですtype、それはになりtype(b)ます。この場合とメソッドの通常の場合の主な違いは、通常の関数オブジェクトが実装する記述子プロトコルにより、通常、クラス定義でa.__add__設定__add__したものとは異なるオブジェクトになることです。(ここには関係ない他のいくつかのトリッキーなビットもあります。)
user2357112はMonicaをサポートします

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
それはかなり削減OOだった
アディソンCrumpの

@xnor minすでに__self__属性があるため機能しません。そのため、クラスは自身のバインドをスキップします。なぜ別の質問min__self__あるのか
...-matsjoyce

@matsjoyce:いいえ、それはを持っているという事実とminは何の関係もありません__self__min.__self__は、組み込み関数と組み込みメソッドが同じ型としてどのように実装されるかの成果物にすぎません。minPythonで記述された関数とは異なり、組み込み関数は記述子プロトコルをサポートしていないため、ここでは機能しません。記述子プロトコルは、最初の引数のバインドを担当します。
user2357112は、2016


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はオンデマンドで徹底的な等価性チェックのみを実行するため)。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.