Python 97 (karmaşık noktalar olmadan)
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]))
Bu, herhangi bir sıradaki [(x, y), (x, y), (x, y), (x, y)] içindeki nokta dişlerinin listelerini alır ve kopyaları ya da yanlış noktaları ele alabilir. Diğer python cevapları gibi karmaşık noktalar gerektirmez.
Bu şekilde test edebilirsiniz:
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)
Bu biraz açıklama gerektirecektir, ancak genel fikir, bir kare içindeki noktalar arasında yalnızca üç mesafe olduğu yönündedir (Side, Diagonal, Zero (kendisiyle karşılaştırıldığında puan)):
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]))
- t plerin bir listesi için (x, y)
- Set (p) kullanarak kopyaları kaldırın ve sonra uzunluğu test edin
- Her nokta kombinasyonunu elde edin (a, b için p, c, d, p)
- Her noktadan diğer noktalara kadar olan mesafelerin listesini alın
- Sadece üç benzersiz uzaklık olduğunu kontrol etmek için set kullanın - Sıfır (kendisiyle karşılaştırıldığında puan) - Yan uzunluk - Çapraz uzunluk
Kod karakterlerini kaydetmek için Ben:
- 1 karakter işlev ismi kullanarak
- 1 satır işlev tanımı kullanarak
- Eşsiz puanların sayısını 4 kontrol etmek yerine, farklı puan uzunluklarının -1 olduğunu kontrol ediyorum (tasarruf == 3 ==)
- a [b], yerine [1] yerine a, b in p, c in d elde etmek için listeyi ve dizini açma işlemini kullanın.
- sqrt (x) almak için matematik dahil etmek yerine pow (x, .5) kullanır
- sonra boşluk bırakmamak
- şamandıranın önüne sıfır koymamak
Birisinin bunu kıran bir test davası bulabilmesinden korkuyorum. Öyleyse lütfen yap ve düzeltir. Örneğin, bir abs () yapmak ve yan uzunluk ve hipotenüs kontrolü yapmak yerine sadece üç mesafeyi kontrol etmem aslında bir hata gibi görünüyor.
İlk defa golf kodunu denedim. Ev kurallarına uymazsam kibar olun.