FOIL Pythons starkes Tippen!


35

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 Trueohne Ausnahmen zu bewerten .

Zur Verdeutlichung kopiere ich Ihren Code in eine Datei und dann in fromdie 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).

Antworten:


20

54 52 50 49 48 45 39 Bytes

4 Bytes dank Dennis entfernt.

Die neueste Version ist von der Antwort von xnor "aus irgendeinem Grund" inspiriert.

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

Nett! Es gibt 0 .__mul__dafür lambda y:0aber es ist die gleiche Länge.
xnor

x.countSpeichert ein Byte.
Dennis

1
Ich verstehe es nicht ... type(t(), t())oder t().type(t())wirft eine Ausnahme, also was passiert, wenn Sie es tun t() + t()?
Feersum

1
@feersum __add__wird mit zwei aufgerufen, aber die erste wird interpretiert als self, nur otheran übergeben type. Komisch, ja.
Jonathan Allan

1
@feersum: a + berste versuche a.__add__(b). a.__add__ist type, so wird das type(b). Der Hauptunterschied zwischen diesem Fall und dem für Methoden üblichen Fall besteht darin, dass a.__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 knifflige
Dinge, die

10

54 Bytes

class m(int):__call__=__add__=lambda*x:m()
a=b=c=d=m()

Erstellen Sie ein Objekt, von dem intnur eine Kopie von sich selbst zurückgegeben wird, außer beim Hinzufügen oder Aufrufen.

Die gleiche Länge:

class m(int):__call__=__add__=lambda a,b:a
a=b=c=d=m()

Ich dachte minoder {}.getwürde anstelle von arbeiten lambda a,b:a, aber aus irgendeinem Grund handeln sie nur nach dem zweiten Argument.


1
(Es ist Code-Golf )
Addison Crump

1
Hoppla, ich habe nur Programmierpuzzle gesehen , werde Golf spielen.
xnor

3
Das war eine ziemliche Reduzierung
Addison Crump

@xnor Funktioniert nicht, da minbereits ein __self__Attribut vorhanden ist. Die Klasse überspringt das Binden ihres eigenen Selbst. Warum minhat __self__ist eine andere Frage ...
matsjoyce

@matsjoyce: Nein, es hat nichts damit zu tun, dass mina __self__. min.__self__ist nur ein Artefakt davon, wie integrierte Funktionen und integrierte Methoden als der gleiche Typ implementiert werden. minfunktioniert 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.
user2357112 unterstützt Monica


1

68 Bytes

Während es nicht wirklich mit den vorhandenen Antworten konkurrieren kann, führt dieses tatsächlich die fragliche Berechnung durch:

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

Erläuterung:

  • SymPy ist ein Modul für symbolische Berechnungen.
  • sympy.abcenthält alle Ein-Buchstaben - Symbole, insbesondere diejenigen genannt a, b, c, und d.
  • a+bist ein AddObjekt, das eine allgemeine Summe darstellt.
  • type(a+b).__call__= […]monkey-patches die AddKlasse, 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).
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.