FOIL पायथन की मजबूत टाइपिंग!


35

आपका कार्य पायथन 2 या 3 में कुछ कोड लिखना है, जैसे कि यह अभिव्यक्ति:

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

Trueबिना किसी अपवाद को बढ़ाए मूल्यांकन करेगा ।

स्पष्ट करने के लिए, मैं आपके कोड को एक फ़ाइल में कॉपी करूंगा, फिर fromफ़ाइल import *। फिर मैं एक्सप्रेशन को कंसोल में टाइप करूँगा और सत्यापित करूँगा कि यह है True।

यह कोड-गोल्फ है, इसलिए सबसे कम लंबाई (बाइट्स में) वाला उत्तर जीतता है।

जवाबों:


20

54 52 50 49 48 45 39 बाइट्स

डेनिस की बदौलत 4 बाइट निकाले।

नवीनतम संस्करण xnor के उत्तर में "कुछ कारण" से प्रेरित है।

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

अच्छा! के 0 .__mul__लिए है, lambda y:0लेकिन यह एक ही लंबाई है।
— xnor

x.countएक बाइट बचाता है।
— डेनिस

1
मुझे यह नहीं मिला ... type(t(), t())या t().type(t())एक अपवाद फेंकता है, तो जब आप करते हैं तो क्या हो रहा है t() + t()?
— 3

1
@ फ़ेर्सम __add__को दो के साथ कहा जाता है, लेकिन पहले की व्याख्या की जाती है self, केवल otherपास की जाती है type। अजीब, हाँ।
— जोनाथन एलन

1
@ फैर्सम: a + bपहले प्रयास करता है a.__add__(b)। a.__add__है type, इसलिए वह बन जाता है type(b)। इस मामले और विधियों के लिए सामान्य मामले के बीच महत्वपूर्ण अंतर यह है कि आमतौर पर, डिस्क्रिप्टर प्रोटोकॉल के कारण वर्ग परिभाषा में a.__add__आपके द्वारा सेट की गई चीज़ से एक अलग वस्तु होगी , जो साधारण फ़ंक्शन ऑब्जेक्ट को लागू करते हैं। (कुछ अन्य मुश्किल बिट्स भी हैं जो यहां प्रासंगिक नहीं हैं।)__add__
— user2357112 मोनिका

10

54 बाइट्स

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

एक ऐसी वस्तु बनाएं int, जो केवल जोड़ने या कॉल करने के अलावा विरासत में मिलती है , स्वयं की एक प्रति लौटाती है।

एक ही लंबाई:

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

मैंने सोचा minया {}.getइसके स्थान पर काम करूंगा lambda a,b:a, लेकिन किसी कारण से वे केवल दूसरे तर्क पर कार्य करते हैं।



1
उफ़, मैंने केवल प्रोग्रामिंग-पज़ल देखी , गोल्फ जाएगा।
— xnor

3
यह काफी कमी थी
— Addison Crump

@xnor यह काम नहीं करता है क्योंकि minपहले से ही एक __self__विशेषता है, इसलिए वर्ग अपने स्वयं के बंधन को छोड़ देता है। एक और सवाल क्यों minहै __self__...
— matsjoyce

@ मैट्सजॉय: नहीं, इसका इस तथ्य से कोई लेना-देना नहीं है कि minए __self__। min.__self__बिल्ट-इन फ़ंक्शंस और बिल्ट-इन विधियों को एक ही प्रकार के रूप में लागू करने की एक कलाकृति है। minयहाँ काम नहीं करता है क्योंकि पायथन में लिखे गए कार्यों के विपरीत, अंतर्निहित कार्य डिस्क्रिप्टर प्रोटोकॉल का समर्थन नहीं करते हैं, जो पहले तर्क को बाध्य करने के लिए जिम्मेदार है।
— user2357112


1

68 बाइट्स

हालांकि यह वास्तव में मौजूदा उत्तरों के साथ प्रतिस्पर्धा नहीं कर सकता है, यह वास्तव में प्रश्न में गणना करता है:

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

स्पष्टीकरण:

  • SymPy प्रतीकात्मक संगणना के लिए एक मॉड्यूल है।
  • sympy.abcसभी एकल अक्षर का प्रतीक हैं, नामित विशेष लोगों में a, b, c, और d।
  • a+bएक Addवस्तु है, जो एक सामान्य राशि का प्रतिनिधित्व करती है।
  • type(a+b).__call__= […]बंदर-पैच Addवर्ग को मूल्यांकन क्षमता देने के लिए, इस मामले में यह कॉलर और कैलली के गुणन की तरह काम करने में सक्षम बनाता है।
  • expand वास्तव में समान बनाने के लिए आवश्यक है (चूंकि सिम्पी केवल मांग पर पूरी तरह से समानता की जांच करता है)।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.