Python 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)] ในลำดับใดก็ได้และสามารถจัดการรายการที่ซ้ำกันหรือจำนวนจุดที่ไม่ถูกต้อง ไม่ต้องใช้คะแนนที่ซับซ้อนเหมือนคำตอบอื่น ๆ ของหลาม
คุณสามารถทดสอบได้ดังนี้:
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]))
- สำหรับรายการ p ของ tuples (x, y)
- ลบรายการที่ซ้ำกันโดยใช้ set (p) จากนั้นทดสอบความยาว
- รับคะแนนรวมกันทุกครั้ง (a, b ใน p สำหรับ c, d in p)
- รับรายการระยะทางจากทุกจุดถึงจุดอื่น
- ใช้การตั้งค่าเพื่อตรวจสอบว่ามีระยะทางเฉพาะสามระยะทาง - ศูนย์ (จุดเปรียบเทียบกับตัวเอง) - ความยาวด้าน - ความยาวแนวทแยง
หากต้องการบันทึกอักขระรหัสฉัน:
- ใช้ชื่อฟังก์ชั่นถ่าน 1 ตัว
- ใช้นิยามฟังก์ชั่น 1 บรรทัด
- แทนที่จะตรวจสอบจำนวนจุดที่ไม่ซ้ำกันคือ 4 ฉันตรวจสอบว่าเป็น -1 ความยาวจุดที่แตกต่างกัน (save == 3 ==)
- ใช้ list และ tuple unpacking เพื่อรับ a, b ใน p สำหรับ c, d in p, แทนที่จะใช้ [0], a [1]
- ใช้ pow (x, .5) แทนการรวมคณิตศาสตร์เพื่อรับ sqrt (x)
- ไม่ใส่ช่องว่างหลังจาก)
- ไม่วางศูนย์นำบนลอย
ฉันเกรงว่าบางคนจะพบกรณีทดสอบที่ทำให้เกิดข้อผิดพลาด ดังนั้นโปรดทำและแก้ไขให้ถูกต้อง เช่นความจริงที่ว่าฉันแค่ตรวจสอบสามระยะทางแทนที่จะทำ abs () และตรวจสอบความยาวด้านและด้านตรงข้ามมุมฉากดูเหมือนว่าจะเป็นข้อผิดพลาด
ครั้งแรกที่ฉันลองรหัสกอล์ฟ มีน้ำใจถ้าฉันทำผิดกฎของบ้าน