Python 97 (senza punti complessi)
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]))
Questo prenderà elenchi di tuple di punti in [(x, y), (x, y), (x, y), (x, y)] in qualsiasi ordine e può gestire duplicati o un numero errato di punti. NON richiede punti complessi come le altre risposte di Python.
Puoi provarlo in questo modo:
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)
Questo richiederà un po 'di spiegazione, ma l'idea generale è che ci sono solo tre distanze tra i punti in un quadrato (Lato, Diagonale, Zero (punto rispetto a se stesso)):
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]))
- per un elenco p di tuple (x, y)
- Rimuovere i duplicati usando set (p) e quindi testare la lunghezza
- Ottieni ogni combinazione di punti (a, b in p per c, d in p)
- Ottieni l'elenco della distanza da ogni punto a ogni altro punto
- Usa set per verificare che ci siano solo tre distanze uniche - Zero (punto rispetto a se stesso) - Lunghezza laterale - Lunghezza diagonale
Per salvare i caratteri in codice sono:
- utilizzando un nome di funzione 1 carattere
- usando una definizione di funzione a 1 riga
- Invece di verificare che il numero di punti univoci sia 4, controllo che sia -1 le diverse lunghezze dei punti (salva == 3 ==)
- usa list e tuple unpacking per ottenere a, b in p per c, d in p, invece di usare a [0], a [1]
- usa pow (x, .5) invece di includere la matematica per ottenere sqrt (x)
- non mettere spazi dopo il)
- non mettere uno zero iniziale sul float
Temo che qualcuno riesca a trovare un caso di prova che lo rompa. Quindi, per favore, fallo e maledetto. Ad esempio, il fatto che io controlli solo tre distanze, invece di fare un abs () e controllare la lunghezza del lato e l'ipotenusa, sembra un errore.
La prima volta che ho provato il codice golf. Sii gentile se ho infranto le regole della casa.