पायथन 97 (जटिल बिंदुओं के बिना)
def t(p):return len(set(p))-1==len(set([pow(pow(a-c,2)+pow(b-d,2),.5)for a,b in p for c,d in p]))
यह किसी भी क्रम में [(x, y), (x, y), (x, y), (x, y)] में बिंदु tuples की सूची ले जाएगा, और डुप्लिकेट, या अंकों की गलत संख्या को संभाल सकता है। यह अन्य अजगर जवाब की तरह जटिल बिंदुओं की आवश्यकता नहीं है।
आप इसे इस तरह से परख सकते हैं:
S1 = [(0,0),(1,0),(1,1),(0,1)] # standard square
S2 = [(0,0),(2,1),(3,-1),(1,-2)] # non-axis-aligned square
S3 = [(0,0),(1,1),(0,1),(1,0)] # different order
S4 = [(0,0),(2,2),(0,2),(2,0)] #
S5 = [(0,0),(2,2),(0,2),(2,0),(0,0)] #Redundant points
B1 = [(0,0),(0,2),(3,2),(3,0)] # rectangle
B2 = [(0,0),(3,4),(8,4),(5,0)] # rhombus
B3 = [(0,0),(0,0),(1,1),(0,0)] # only 2 distinct points
B4 = [(0,0),(0,0),(1,0),(0,1)] # only 3 distinct points
B5 = [(1,1),(2,2),(3,3),(4,4)] # Points on the same line
B6 = [(0,0),(2,2),(0,2)] # Not enough points
def tests(f):
assert(f(S1) == True)
assert(f(S2) == True)
assert(f(S3) == True)
assert(f(S4) == True)
assert(f(S5) == True)
assert(f(B1) == False)
assert(f(B2) == False)
assert(f(B3) == False)
assert(f(B4) == False)
assert(f(B5) == False)
assert(f(B6) == False)
def t(p):return len(set(p))-1==len(set([pow(pow(a-c,2)+pow(b-d,2),.5)for a,b in p for c,d in p]))
tests(t)
यह थोड़ा व्याख्यायित करेगा, लेकिन समग्र विचार यह है कि एक वर्ग (बिंदु, विकर्ण, शून्य (स्वयं की तुलना में बिंदु)) में बिंदुओं के बीच केवल तीन दूरी हैं:
def t(p):return len(set(p))-1==len(set([pow(pow(a-c,2)+pow(b-d,2),.5)for a,b in p for c,d in p]))
- tuples की सूची p के लिए (x, y)
- सेट (पी) का उपयोग करके डुप्लिकेट निकालें और फिर लंबाई का परीक्षण करें
- अंकों के हर संयोजन को प्राप्त करें (a, b in p for c, d in p)
- हर बिंदु से हर दूसरे बिंदु की दूरी की सूची प्राप्त करें
- यह जांचने के लिए सेट का उपयोग करें कि केवल तीन अद्वितीय दूरी हैं - शून्य (खुद की तुलना में बिंदु) - साइड लंबाई - विकर्ण लंबाई
कोड वर्ण सहेजने के लिए मैं हूं:
- 1 चार फ़ंक्शन नाम का उपयोग करना
- 1 लाइन फ़ंक्शन परिभाषा का उपयोग करना
- अद्वितीय बिंदुओं की संख्या की जांच करने के बजाय 4 है, मैं जांचता हूं कि यह -1 अलग-अलग बिंदु लंबाई है (== 3 == बचाता है)
- एक [0], एक [1] का उपयोग करने के बजाय, c, p के लिए p, d, के लिए p और b को प्राप्त करने के लिए सूची और tuple का उपयोग न करें।
- sqrt पाने के लिए गणित को शामिल करने के बजाय pow (x, .5) का उपयोग करता है (x)
- के बाद रिक्त स्थान नहीं डालना)
- फ्लोट पर एक अग्रणी शून्य नहीं डाल रहा है
मुझे डर है कि कोई ऐसा टेस्ट केस खोज सकता है जो इसे तोड़ दे। तो कृपया और ठीक करें। उदाहरण के लिए, मैं सिर्फ एक एब्स करने के बजाय तीन दूरी के लिए जांच करता हूं () और साइड की लंबाई और कर्ण के लिए जांच, एक त्रुटि की तरह लगता है।
पहली बार मैंने कोड गोल्फ की कोशिश की है। अगर मैंने घर के किसी नियम को तोड़ा है तो दयालु बनो।