Votre tâche consiste à écrire du code en Python 2 ou 3 tel que cette expression:
(a+b)(c+d) == a*c + b*c + a*d + b*d
évaluera à True
sans lever aucune exception.
Pour clarifier, je vais copier votre code dans un fichier, puis from
le fichier import *
. Ensuite, je vais taper l'expression dans la console et vérifier que c'est bien le cas True
.
C'est du code-golf, donc la réponse avec la longueur la plus courte (en octets) est gagnante.
0 .__mul__
pourlambda y:0
mais c'est la même longueur.x.count
enregistre un octet.type(t(), t())
out().type(t())
jette une exception, alors qu'est-ce qui se passe quand vous faitest() + t()
?__add__
est appelé avec deux, mais le premier est interprété comme étantself
uniquementother
transmis àtype
. Bizarre, oui.a + b
premiers essaisa.__add__(b)
.a.__add__
esttype
, alors ça devienttype(b)
. La principale différence entre ce cas et le cas habituel pour les méthodes est qu'habituellement, ila.__add__
s'agirait d'un objet différent de ce que vous avez défini__add__
dans la définition de classe, en raison du protocole de descripteur , que les objets fonction ordinaires implémentent. (Il existe également quelques autres éléments délicats qui ne sont pas pertinents ici.)54 octets
Faire un objet qui hérite de
int
, sauf que l'ajout ou l'appelant renvoie simplement une copie de lui-même.Même longueur:
J'ai pensé
min
ou{}.get
travaillerais à la place delambda a,b:a
, mais pour une raison quelconque, ils agissent uniquement sur le deuxième argument.la source
min
déjà un__self__
attribut, donc la classe ignore la liaison elle-même. Pourquoimin
a- t__self__
-il une autre question ...min
a un__self__
.min.__self__
est juste un artefact de la façon dont les fonctions intégrées et les méthodes intégrées sont implémentées dans le même type.min
ne fonctionne pas ici car, contrairement aux fonctions écrites en Python, les fonctions intégrées ne prennent pas en charge le protocole de descripteur, qui est responsable de la liaison du premier argument.8166 octetsla source
68 octets
Bien qu'il ne puisse pas vraiment concurrencer les réponses existantes, celle-ci effectue le calcul en question:
Explication:
sympy.abc
contient tous les symboles d'une seule lettre, en particulier celles nomméesa
,b
,c
etd
.a+b
est unAdd
objet qui représente une somme générale.type(a+b).__call__= […]
monkey corrige laAdd
classe pour lui donner des capacités d'évaluation, lui permettant dans ce cas de fonctionner comme une multiplication de l'appelant et de l'appelé.expand
est nécessaire pour rendre les expressions réellement égales (puisque SymPy effectue uniquement des contrôles d’égalité approfondis à la demande).la source