Python 97 (без складних точок)
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]))
Це займе списки точкових кортежів у [(x, y), (x, y), (x, y), (x, 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)
Це займе трохи пояснення, але загальна ідея полягає в тому, що між точками в квадраті є лише три відстані (Side, Diagonal, Zero (точка порівняно з собою)):
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]))
- для списку p кортежів (x, y)
- Видаліть дублікати, використовуючи set (p), а потім протестуйте довжину
- Отримайте кожну комбінацію точок (a, b в p для c, d у p)
- Отримайте список відстані від кожної точки до кожної іншої точки
- Використовуйте для встановлення лише три унікальні відстані - Нуль (точка порівняно з самим собою) - Довжина сторони - Довжина діагоналі
Для збереження кодових символів я:
- використовуючи ім'я функції 1 char
- використовуючи визначення функції 1 рядка
- Замість того, щоб перевіряти кількість унікальних точок 4, я перевіряю, що це -1 різної довжини точок (економить == 3 ==)
- скористайтеся списком та розпакуванням кортежа, щоб отримати a, b в p для c, d у p, замість того, щоб використовувати [0], a [1]
- використовує pow (x, .5) замість включення математики для отримання sqrt (x)
- не ставлячи пробілів після)
- не ставлячи провідний нуль на поплавок
Я боюся, що хтось може знайти тестовий випадок, який порушує це. Тому, будь ласка, зробіть і неправильно. Наприклад, те, що я просто перевіряю на три відстані, замість того, щоб робити abs () і перевіряти на бічну довжину та гіпотенузу, здається помилкою.
Перший раз я спробував код гольфу. Будьте ласкаві, якщо я порушив будь-які домашні правила.