FOLIA Silne pisanie w Pythonie!

35

Twoim zadaniem jest napisanie kodu w języku Python 2 lub 3, tak aby to wyrażenie:

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

oceni Truebez zgłaszania wyjątków.

Aby to wyjaśnić, skopiuję twój kod do pliku, a następnie fromdo pliku import *. Następnie wpiszę wyrażenie w konsoli i sprawdzę, czy tak jest True.

To jest golf golfowy, więc wygrywa odpowiedź o najkrótszej długości (w bajtach).

Esolanging Fruit
źródło

Odpowiedzi:

20

54 52 50 49 48 45 39 bajtów

Usunięto 4 bajty dzięki Dennisowi.

Najnowsza wersja została zainspirowana „jakimś powodem” w odpowiedzi Xnora.

class t(int):__add__=type
a=b=t()
c=d=0
jimmy23013
źródło
Miły! Jest 0 .__mul__za, lambda y:0ale ma tę samą długość.
xnor 28.10.16
x.countzapisuje bajt.
Dennis
1
Nie rozumiem ... type(t(), t())ani nie t().type(t())rzuca wyjątku, więc co się dzieje, kiedy to robisz t() + t()?
feersum
1
@feersum __add__jest wywoływane z dwoma, ale pierwszy interpretowany jest jako self, tylko otherprzekazywany jest do type. Dziwne tak.
Jonathan Allan
1
@feersum: a + bpierwsze próby a.__add__(b). a.__add__jest type, więc tak się stanie type(b). Kluczowa różnica między tym przypadkiem a zwykłym przypadkiem dla metod polega na tym, że zwykle a.__add__byłby to obiekt inny niż ustawiony __add__w definicji klasy, ze względu na protokół deskryptora , który implementują zwykłe obiekty funkcyjne. (Jest też kilka innych podchwytliwych bitów, które nie są tutaj istotne.)
user2357112 obsługuje Monikę
10

54 bajty

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

Stwórz obiekt, który dziedziczy int, oprócz dodawania lub wywoływania zwraca tylko swoją kopię.

Ta sama długość:

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

Myślałem minlub {}.getzadziała zamiast lambda a,b:a, ale z jakiegoś powodu działają one tylko na drugim argumencie.

xnor
źródło
1
(to kod-golf )
Addison Crump
1
Ups, widziałem tylko puzzle programowania , będę grał w golfa.
xnor 28.10.16
3
To była spora redukcja oo
Addison Crump
@xnor Nie działa, ponieważ minma już __self__atrybut, więc klasa pomija wiązanie własnego ja. Dlaczego minma __self__to inna kwestia ...
matsjoyce
@matsjoyce: Nie, to nie ma nic wspólnego z faktem, że minma __self__. min.__self__jest tylko artefaktem tego, w jaki sposób wbudowane funkcje i wbudowane metody są implementowane jako ten sam typ. minnie działa tutaj, ponieważ w przeciwieństwie do funkcji napisanych w Pythonie, wbudowane funkcje nie obsługują protokołu deskryptora, który jest odpowiedzialny za powiązanie pierwszego argumentu.
user2357112 obsługuje Monikę
3

81 66 bajtów

class e:__mul__=lambda*o:0;__add__=lambda*o:lambda x:0
a=b=c=d=e()
Jonathan Allan
źródło
1

68 bajtów

Chociaż nie może tak naprawdę konkurować z istniejącymi odpowiedziami, ta faktycznie wykonuje omawiane obliczenia:

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

Wyjaśnienie:

  • SymPy to moduł do obliczeń symbolicznych.
  • sympy.abczawiera wszystkie single-literowe symbole, w szczególności te, o nazwie a, b,c , i d.
  • a+b jest Add przedmiotem reprezentującym ogólną sumę.
  • type(a+b).__call__= […] łaty małpa Add klasę, aby dać jej możliwości oceny, w tym przypadku umożliwiając jej działanie jak mnożenie dzwoniącego i odbierającego.
  • expand jest konieczne, aby wyrażenia faktycznie były równe (ponieważ SymPy wykonuje dokładne kontrole równości tylko na żądanie).
Wrzlprmft
źródło