Python 97 (tanpa poin kompleks)
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]))
Ini akan mengambil daftar tupel titik dalam [(x, y), (x, y), (x, y), (x, y)] dalam urutan apa pun, dan dapat menangani duplikat, atau jumlah poin yang salah. TIDAK memerlukan poin kompleks seperti jawaban python lainnya.
Anda dapat mengujinya seperti ini:
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)
Ini akan membutuhkan sedikit penjelasan, tetapi gagasan keseluruhan adalah bahwa hanya ada tiga jarak antara titik-titik dalam kotak (Sisi, Diagonal, Nol (titik dibandingkan dengan dirinya sendiri)):
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]))
- untuk daftar p dari tupel (x, y)
- Hapus duplikat menggunakan set (p) dan kemudian menguji panjangnya
- Dapatkan setiap kombinasi poin (a, b dalam p untuk c, d dalam p)
- Dapatkan daftar jarak dari setiap titik ke setiap titik lainnya
- Gunakan set untuk memeriksa hanya ada tiga jarak unik - Nol (titik dibandingkan dengan dirinya sendiri) - Panjang sisi - Panjang diagonal
Untuk menyimpan karakter kode saya adalah:
- menggunakan nama fungsi 1 char
- menggunakan definisi fungsi 1 baris
- Alih-alih memeriksa jumlah poin unik adalah 4, saya memeriksa bahwa itu adalah -1 panjang titik yang berbeda (menyimpan == 3 ==)
- gunakan daftar dan tuple membongkar untuk mendapatkan, b dalam p untuk c, d dalam p, alih-alih menggunakan [0], a [1]
- menggunakan pow (x, .5) alih-alih memasukkan matematika untuk mendapatkan sqrt (x)
- tidak menempatkan spasi setelah)
- tidak menempatkan nol di depan float
Saya khawatir seseorang dapat menemukan test case yang memecahkan ini. Jadi tolong lakukan dan saya akan benar. Misalnya fakta saya hanya memeriksa tiga jarak, bukannya melakukan abs () dan memeriksa panjang sisi dan sisi miring, sepertinya kesalahan.
Pertama kali saya mencoba kode golf. Berbaik hatilah jika aku melanggar aturan rumah.