Python 97 (bez punktów złożonych)
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]))
Spowoduje to pobranie list krotek punktowych w [(x, y), (x, y), (x, y), (x, y)] w dowolnej kolejności i może obsłużyć duplikaty lub niewłaściwą liczbę punktów. NIE wymaga złożonych punktów, takich jak inne odpowiedzi w języku Python.
Możesz to przetestować w następujący sposób:
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)
To wymaga trochę wyjaśnienia, ale ogólną ideą jest to, że istnieją tylko trzy odległości między punktami w kwadracie (bok, przekątna, zero (punkt w porównaniu do siebie)):
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]))
- dla listy p krotek (x, y)
- Usuń duplikaty za pomocą zestawu (p), a następnie przetestuj długość
- Zdobądź każdą kombinację punktów (a, bw p dla c, dw p)
- Uzyskaj listę odległości od każdego punktu do każdego innego punktu
- Użyj zestawu, aby sprawdzić, czy istnieją tylko trzy unikalne odległości - zero (punkt w porównaniu do siebie) - długość boku - długość po przekątnej
Aby zapisać znaki kodowe, jestem:
- używając nazwy funkcji 1 char
- używając definicji funkcji 1-liniowej
- Zamiast sprawdzać liczbę unikalnych punktów to 4, sprawdzam, że -1 to różne długości punktów (zapisy == 3 ==)
- użyj listy i rozpakowywania krotek, aby uzyskać a, bw p dla c, d w p, zamiast używania [0], a [1]
- używa pow (x, .5) zamiast matematyki, aby uzyskać sqrt (x)
- nie wstawianie spacji po)
- nie umieszczając wiodącego zera na pływaku
Obawiam się, że ktoś może znaleźć przypadek testowy, który to psuje. Więc proszę, zrób i źle. Na przykład fakt, że sprawdzam tylko trzy odległości, zamiast wykonywania abs () i sprawdzania długości boku i przeciwprostokątnej, wydaje się błędem.
Pierwszy raz próbowałem golfa kodowego. Bądź miły, jeśli złamałem jakieś zasady domu.