Python 97 (không có điểm phức tạp)
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]))
Điều này sẽ lấy danh sách các bộ điểm theo [(x, y), (x, y), (x, y), (x, y)] theo bất kỳ thứ tự nào và có thể xử lý các điểm trùng lặp hoặc sai số điểm. Nó KHÔNG yêu cầu các điểm phức tạp như các câu trả lời trăn khác.
Bạn có thể kiểm tra nó như thế nà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)
Điều này sẽ giải thích một chút, nhưng ý tưởng tổng thể là chỉ có ba khoảng cách giữa các điểm trong một hình vuông (Cạnh, Đường chéo, Không (điểm so với chính nó)):
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]))
- cho một danh sách p của các bộ dữ liệu (x, y)
- Loại bỏ trùng lặp bằng cách sử dụng bộ (p) và sau đó kiểm tra độ dài
- Lấy mọi tổ hợp điểm (a, b in p cho c, d trong p)
- Nhận danh sách khoảng cách từ mọi điểm đến mọi điểm khác
- Sử dụng thiết lập để kiểm tra chỉ có ba khoảng cách duy nhất - Không (điểm so với chính nó) - Độ dài cạnh - Độ dài đường chéo
Để lưu ký tự mã tôi là:
- sử dụng tên hàm 1 char
- sử dụng định nghĩa hàm 1 dòng
- Thay vì kiểm tra số điểm duy nhất là 4, tôi kiểm tra xem đó là -1 độ dài điểm khác nhau (lưu == 3 ==)
- sử dụng danh sách và bộ giải nén để lấy a, b in p cho c, d trong p, thay vì sử dụng [0], a [1]
- sử dụng pow (x, .5) thay vì bao gồm toán học để có sqrt (x)
- không đặt dấu cách sau)
- không đặt số 0 đứng đầu
Tôi sợ ai đó có thể tìm thấy một trường hợp thử nghiệm phá vỡ điều này. Vì vậy, xin vui lòng làm và Ill đúng. Ví dụ, thực tế tôi chỉ kiểm tra ba khoảng cách, thay vì thực hiện abs () và kiểm tra độ dài cạnh và cạnh huyền, có vẻ như là một lỗi.
Lần đầu tiên tôi đã thử chơi golf code. Hãy tử tế nếu tôi phá vỡ bất kỳ quy tắc nhà.