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 True
bez zgłaszania wyjątków.
Aby to wyjaśnić, skopiuję twój kod do pliku, a następnie from
do 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).
0 .__mul__
za,lambda y:0
ale ma tę samą długość.x.count
zapisuje bajt.type(t(), t())
ani niet().type(t())
rzuca wyjątku, więc co się dzieje, kiedy to robiszt() + t()
?__add__
jest wywoływane z dwoma, ale pierwszy interpretowany jest jakoself
, tylkoother
przekazywany jest dotype
. Dziwne tak.a + b
pierwsze próbya.__add__(b)
.a.__add__
jesttype
, więc tak się stanietype(b)
. Kluczowa różnica między tym przypadkiem a zwykłym przypadkiem dla metod polega na tym, że zwyklea.__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.)54 bajty
Stwórz obiekt, który dziedziczy
int
, oprócz dodawania lub wywoływania zwraca tylko swoją kopię.Ta sama długość:
Myślałem
min
lub{}.get
zadziała zamiastlambda a,b:a
, ale z jakiegoś powodu działają one tylko na drugim argumencie.źródło
min
ma już__self__
atrybut, więc klasa pomija wiązanie własnego ja. Dlaczegomin
ma__self__
to inna kwestia ...min
ma__self__
.min.__self__
jest tylko artefaktem tego, w jaki sposób wbudowane funkcje i wbudowane metody są implementowane jako ten sam typ.min
nie 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.8166 bajtówźródło
68 bajtów
Chociaż nie może tak naprawdę konkurować z istniejącymi odpowiedziami, ta faktycznie wykonuje omawiane obliczenia:
Wyjaśnienie:
sympy.abc
zawiera wszystkie single-literowe symbole, w szczególności te, o nazwiea
,b
,c
, id
.a+b
jestAdd
przedmiotem reprezentującym ogólną sumę.type(a+b).__call__= […]
łaty małpaAdd
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).źródło