Напишите функцию, которая принимает 4 точки на плоскости в качестве входных данных и возвращает true, если 4 точки образуют квадрат. Точки будут иметь интегральные координаты с абсолютными значениями <1000.
Вы можете использовать любое разумное представление 4 точек в качестве входных данных. Очки не предоставляются в каком-либо конкретном порядке.
Самый короткий код выигрывает.
Примеры квадратов:
(0,0),(0,1),(1,1),(1,0) # standard square
(0,0),(2,1),(3,-1),(1,-2) # non-axis-aligned square
(0,0),(1,1),(0,1),(1,0) # different order
Пример не квадратов:
(0,0),(0,2),(3,2),(3,0) # rectangle
(0,0),(3,4),(8,4),(5,0) # rhombus
(0,0),(0,0),(1,1),(0,0) # only 2 distinct points
(0,0),(0,0),(1,0),(0,1) # only 3 distinct points
Вы можете вернуть либо true, либо false для вырожденного квадрата (0,0),(0,0),(0,0),(0,0)
Ответы:
Python
1769079 байтФункция S принимает в качестве входных данных список комплексных чисел (A). Если мы знаем как центр, так и один угол квадрата, мы можем восстановить квадрат, повернув угол на 90 180 и 270 градусов вокруг центральной точки (с). В комплексной плоскости поворот на 90 градусов вокруг начала координат производится умножением точки на i . Если наша первоначальная форма и восстановленный квадрат имеют одинаковые точки, то это должен быть квадрат.
источник
J, 28
172527J на самом деле не имеет функций, но вот монадический глагол, который берет вектор точек из комплексной плоскости:
Метод представляет собой смесь Майкла Спенсера (работа исключительно над длинами между вершинами, но в настоящее время он не выполняет мой ромб2) и работами Eelvex (проверьте размеры наборов). Чтение справа налево:
-/~
вычислить все различия точек,
расплющить|
извлечь величину/:~
сортировать#/.~
ну и считать4 8 4 -:
должно иметь ровно 4 равноудаленных (в 0), 8 немного больше (длина 1, стороны), еще 4 больше (длинаsqrt 2
, диагонали)Демонстрация:
Ради памяти, мой предыдущий метод (требовал упорядоченные вершины, но мог обнаруживать правильные многоугольники любого порядка):
Смотрите историю для объяснения и демонстрации. Текущий метод, вероятно, может быть расширен до других многоугольников, которые
4 8 4
очень похожи на биномиальное распределение.источник
3 :'4 8 4-:#/.~/:~|,-/~y'
Python, 71
42Обновление 1) требовать 4 различных точки (ранее давали бы ложные срабатывания для повторных точек - есть ли другие?) 2) определять функцию согласно спецификации
Для квадрата вектор между любыми двумя точками должен быть 0 (одна и та же точка), стороной или диагональю. Итак, множество величин этих векторов должно иметь длину 3.
источник
Хаскель, 100 знаков
Вот как я бы написал решение JB для J на Хаскеле. Без попыток повредить читаемости, удалив несущественные символы, это около 132 символов:
Вы можете сократить его до 100, удалив лишние пробелы и переименовав некоторые вещи
Давайте используем QuickCheck, чтобы убедиться, что он принимает произвольные квадраты с одной вершиной в точке (x, y) и вектором ребра (a, b):
Пробуем это в ghci:
Ах да, пустой квадрат здесь не считается квадратом, поэтому мы пересмотрим наш тест:
И пробую снова:
источник
d
.s l=[4,8,4]==(map length.group.sort)[(x-a)^2+(y-b)^2|(x,y)<-l,(a,b)<-l]
фактор
Реализация на языке программирования Factor :
И некоторые юнит-тесты:
источник
OCaml, 145
164Запустите так:
Давайте разберемся и немного объясним.
Сначала мы определяем норму:
Вы заметите, что вызова sqrt нет, здесь он не нужен.
Здесь a, b, c и d - точки. Мы предполагаем, что эти пункты изложены так:
Если у нас есть квадрат, то все эти условия должны выполняться:
Обратите внимание, что всегда имеет место следующее:
Мы будем использовать это для упрощения нашей тестовой функции ниже.
Поскольку наш вход не упорядочен, мы также должны проверить все перестановки. Без потери общности мы можем избежать перестановки первого пункта:
После упрощения:
Изменить: следуя совету М. Джованнини.
источник
n
для сокращения 20 символов:let t a b c d=a%b+a%c=b%c&&d%c+d%b=b%c&&a%b=a%c&&d%c=d%b
.Python (105)
Точки представлены
(x,y)
кортежами. Очки могут быть в любом порядке и принимает только квадраты. Создает списокs
парных (ненулевых) расстояний между точками. Всего должно быть 12 дистанций в двух уникальных группах.источник
f([(0,0),(0,4),(2,2),(-2,2)])
это квадратPython - 42 символа
Похоже, лучше использовать комплексные числа для точек
где A = [(11 + 13j), (14 + 12j), (13 + 9j), (10 + 10j)]
старый ответ:
Очки указываются в любом порядке в виде списка, например
источник
>>> A=[(0,0),(0,0),(1,1),(0,0)] >>> len(set((a-c)**2+(b-d)**2 for(a,b),(c,d)in combinations(A,2)))==2 True
A=[(0,0),(0,4),(2,2),(-2,2)]; len(set((a-c)**2+(b-d)**2 for(a,b),(c,d)in combinations(A,2)))==2
C # - не совсем короткий. Злоупотребление LINQ. Выбирает различные две комбинации точек на входе, вычисляет их расстояния, а затем проверяет, что ровно четыре из них равны и что существует только одно другое отдельное значение расстояния. Point - это класс с двумя двойными членами, X и Y. Может быть, это просто Tuple, но не так.
источник
PHP, 82 символа
источник
К - 33
Перевод решения J от JB :
К страдает здесь от своих зарезервированных слов (
_sqr
а_sqrt
).Тестирование:
источник
OCaml + Батареи, 132 знака
(Смотри, мама, без пробелов!) Понимание списка в
q
форме формирует список квадратов норм для каждой отдельной неупорядоченной пары точек. Квадрат имеет четыре равные стороны и две равные диагонали, причем длина последних в квадрате в два раза больше длины квадрата в первом. Поскольку в целочисленной решетке нет равносторонних треугольников, тест на самом деле не нужен, но я включу его для полноты.тесты:
источник
Mathematica
65 80 6966Проверяет, что число различных расстояний между точками (не включая расстояние от точки до самого себя) равно 2, а меньшее из двух не равно 0.
использование
NB:
\[And]
это единственный персонаж в Mathematica.источник
Желе , 8 байт
Попробуйте онлайн!
Принимает список комплексных чисел в качестве аргумента командной строки. Отпечатки
1
или0
.Это похоже на приятное испытание для оживления!
источник
Хаскелл (212)
Наивная первая попытка. Проверяет следующие два условия для всех перестановок входного списка точек (где данная перестановка представляет, скажем, упорядочение точек по часовой стрелке):
Деобфусцированный код и тесты
источник
Скала (146 символов)
источник
JavaScript 144 символа
Математически равен ответу J Bs. Он генерирует 6 длин и утверждает, что 2 самых больших равны и что 4 самых маленьких равны. Входные данные должны быть массивом массивов.
источник
PHP,
161158 символовПруф (1x1): http://codepad.viper-7.com/ZlBpOB
Это основано на ответе eBuisness на JavaScript .
источник
JavaScript 1.8, 112 символов
Обновление: сохранены 2 символа путем сложения массива вместе.
Еще одно повторение ответа JB. Использует возможности JavaScript 1.7 / 1.8 (замыкания выражений, понимание массивов, назначение деструктурирования). Также злоупотребляет
~~
(двойной побитовый не оператор), чтобы привестиundefined
к числовому, с приведением массива к строке и регулярным выражением, чтобы проверить, что счетчики длины[4, 8, 4]
(предполагается, что пройдено ровно 4 точки). Злоупотребление оператором запятой - это старый запутанный трюк на Си.тесты:
источник
GoRuby - 66 персонажей
расширен:
Тот же алгоритм, что и у JB .
Тест как:
Выходы
true
для истины и пустые для ложныхисточник
ruby -r ./golf-prelude.rb FILE_TO_RUN.rb
и она будет работать точно так же.sort
раньшеgroup_by
..sort.group_by {...}
должно быть написано как.group_by {...}
Python 97 (без сложных точек)
Это будет принимать списки точечных кортежей в [(x, y), (x, y), (x, y), (x, y)] в любом порядке и может обрабатывать дубликаты или неверное количество точек. Это НЕ требует сложных точек, как и другие ответы Python.
Вы можете проверить это так:
Это потребует небольшого объяснения, но общая идея заключается в том, что между точками в квадрате есть только три расстояния (сторона, диагональ, ноль (точка по сравнению с самим собой)):
Для сохранения символов кода я:
Я боюсь, что кто-то может найти контрольный пример, который сломает это. Так что, пожалуйста, и я исправлю. Например, тот факт, что я просто проверяю три расстояния, вместо того, чтобы выполнять abs () и проверку длины стороны и гипотенузы, кажется ошибкой.
Я впервые попробовал код гольф. Будь добр, если я нарушил какие-либо правила дома.
источник
Clojure, 159 символов.
Изменить: Чтобы также объяснить немного.
(Примечание: квадратный корень не нужен и, следовательно, в коде, сохраненном выше.)
источник
C #, 107 символов
Где точки - это список Vector3D, содержащий точки.
Вычисляет все расстояния в квадрате между всеми точками, и если существует ровно три разных типа (должно быть 0, некоторое значение a и 2 * a) и 4 разных точки, то точки образуют квадрат.
источник
Python, 66
Улучшение ответа лошадки с 76 до 66:
источник
Python 2 , 49 байт
Попробуйте онлайн!
Принимает список из четырех комплексных чисел в качестве входных данных. Поворачивает каждую точку на 90 градусов вокруг среднего и проверяет, что каждая результирующая точка находится в исходном списке.
Такая же длина (хотя в Python 3 короче
{*l}
).Попробуйте онлайн!
источник
^
можно использовать вместо==
.Wolfram Language (Mathematica) ,
3231 байтПопробуйте онлайн!
Принимает список точек, представленных комплексными числами, вычисляет второй и третий центральный момент и проверяет, что оба равны нулю.
Un-golfed:
или
доказательство
Этот критерий работает на всей комплексной плоскости, а не только на гауссовых целых числах .
Во-первых, отметим, что центральные моменты не меняются, когда точки переводятся вместе. Для набора очков
все центральные моменты не зависят
c
(поэтому они называются центральными ):Во-вторых, центральные моменты имеют простую зависимость от общего комплексного масштабирования (масштабирования и поворота) множества точек:
Это означает, что если центральный момент равен нулю, то масштабирование и / или вращение набора точек будут сохранять центральный момент равным нулю.
В-третьих, давайте докажем критерий для списка точек, в которых зафиксированы первые две точки:
При каких условиях действительная и мнимая части второго и третьего центральных моментов равны нулю?
Все эти шесть решений представляют собой квадраты. Следовательно, единственный способ, чтобы список точек формы
{0, 1, x[3] + I*y[3], x[4] + I*y[4]}
мог иметь ноль вторых и третьих центральных моментов, - это когда четыре точки образуют квадрат.Благодаря свойствам сдвига, вращения и масштабирования, продемонстрированным в точках 1 и 2, это означает, что всякий раз, когда второй и третий центральные моменты равны нулю, в некотором состоянии перемещения / поворота / масштабирования мы имеем квадрат. ∎
обобщение
K-й центральный момент правильного n-гона равен нулю, если k не делится на n. Достаточно этих условий должны быть объединены, чтобы составить достаточный критерий для обнаружения n-гонов. Для случая n = 4 достаточно было обнаружить нули при k = 2 и k = 3; например, для обнаружения шестиугольников (n = 6) может потребоваться проверка нулей на k = 2,3,4,5. Я не доказал следующее, но подозреваю, что он обнаружит любой обычный n-gon:
Проблема кода в основном заключается в том, что этот код специализируется на списках длины 4.
источник
J,
31 29 2726проверяет, совпадают ли 8 наименьших расстояний между точками.проверяет, есть ли ровно три вида расстояний между точками (ноль, длина стороны и длина диагонали).4 2 $
это способ записи массива в J.источник
Smalltalk на 106 персонажей
где p - набор точек, например
Я думаю, что математика это звук ...
источник
Mathematica, 123 символа (но вы можете сделать лучше):
Где «a» - это ввод в форме списка Mathematica, например:
a={{0,0},{3,4},{8,4},{5,0}}
Ключ заключается в том, чтобы посмотреть на произведение точек между всеми векторами и заметить, что они должны иметь ровно три значения: 0, x и 2 * x для некоторого значения x. Точечный продукт проверяет как перпендикулярность, так и длину за один проход.
Я знаю, что есть сочетания клавиш Mathematica, которые могут сделать это короче, но я не знаю, что это такое.
источник
Union
вместоSort@DeleteDuplicates
. Я также собрал ваши 3 строки:#[[1]] == 0 && #[[3]]/#[[2]] == 2 &[ Union@Abs@Flatten[Table[c.d, {c, #}, {d, #}]] &[ Flatten[Table[x - y, {x, a}, {y, a}], 1]]]
Haskell, "wc -c" сообщает 110 символов. Не проверяет, что вход имеет 4 элемента.
Я проверял на
источник