Ihre Aufgabe ist es, Code in Python 2 oder 3 so zu schreiben, dass dieser Ausdruck:
(a+b)(c+d) == a*c + b*c + a*d + b*d
wird True
ohne Ausnahmen zu bewerten .
Zur Verdeutlichung kopiere ich Ihren Code in eine Datei und dann in from
die Datei import *
. Dann gebe ich den Ausdruck in die Konsole ein und überprüfe, ob dies der Fall ist True
.
Das ist Code-Golf, also gewinnt die Antwort mit der kürzesten Länge (in Bytes).
0 .__mul__
dafürlambda y:0
aber es ist die gleiche Länge.x.count
Speichert ein Byte.type(t(), t())
odert().type(t())
wirft eine Ausnahme, also was passiert, wenn Sie es tunt() + t()
?__add__
wird mit zwei aufgerufen, aber die erste wird interpretiert alsself
, nurother
an übergebentype
. Komisch, ja.a + b
erste versuchea.__add__(b)
.a.__add__
isttype
, so wird dastype(b)
. Der Hauptunterschied zwischen diesem Fall und dem für Methoden üblichen Fall besteht darin, dassa.__add__
es sich__add__
aufgrund des Deskriptorprotokolls , das gewöhnliche Funktionsobjekte implementieren , normalerweise um ein anderes Objekt handelt als das, das Sie in der Klassendefinition festgelegt haben . (Es gibt auch ein paar andere knifflige54 Bytes
Erstellen Sie ein Objekt, von dem
int
nur eine Kopie von sich selbst zurückgegeben wird, außer beim Hinzufügen oder Aufrufen.Die gleiche Länge:
Ich dachte
min
oder{}.get
würde anstelle von arbeitenlambda a,b:a
, aber aus irgendeinem Grund handeln sie nur nach dem zweiten Argument.quelle
min
bereits ein__self__
Attribut vorhanden ist. Die Klasse überspringt das Binden ihres eigenen Selbst. Warummin
hat__self__
ist eine andere Frage ...min
a__self__
.min.__self__
ist nur ein Artefakt davon, wie integrierte Funktionen und integrierte Methoden als der gleiche Typ implementiert werden.min
funktioniert hier nicht, da integrierte Funktionen im Gegensatz zu in Python geschriebenen Funktionen nicht das Deskriptorprotokoll unterstützen, das für die Bindung des ersten Arguments verantwortlich ist.8166 Bytesquelle
68 Bytes
Während es nicht wirklich mit den vorhandenen Antworten konkurrieren kann, führt dieses tatsächlich die fragliche Berechnung durch:
Erläuterung:
sympy.abc
enthält alle Ein-Buchstaben - Symbole, insbesondere diejenigen genannta
,b
,c
, undd
.a+b
ist einAdd
Objekt, das eine allgemeine Summe darstellt.type(a+b).__call__= […]
monkey-patches dieAdd
Klasse, um ihr Auswertungsmöglichkeiten zu geben. In diesem Fall funktioniert sie wie eine Multiplikation von Anrufern und Angerufenen.expand
ist notwendig, um die Ausdrücke tatsächlich gleich zu machen (da SymPy nur bei Bedarf gründliche Gleichheitsprüfungen durchführt).quelle