Вам дан массив / список / вектор пар целых чисел, представляющих декартовы координаты точек на 2D евклидовой плоскости; все координаты находятся между и , допускаются дубликаты. Найти площадь выпуклой оболочки этих точек, округленную до ближайшего целого числа; точная средняя точка должна быть округлена до ближайшего четного целого числа. Вы можете использовать числа с плавающей точкой в промежуточных вычислениях, но только если вы можете гарантировать, что конечный результат всегда будет правильным. Это код-гольф , поэтому выигрывает самая короткая правильная программа.
Выпуклая оболочка множества точек есть наименьшее выпуклое множество, содержащее . На евклидовой плоскости для любой отдельной точки это сама точка; для двух различных точек - это линия, содержащая их, для трех неколлинеарных точек - это треугольник, который они образуют, и так далее.
Хорошее визуальное объяснение того, что такое выпуклая оболочка, лучше всего описать как представить все точки в виде гвоздей на деревянной доске, а затем растянуть вокруг них резиновую полосу, чтобы охватить все точки:
Некоторые тестовые случаи:
Input: [[50, -13]]
Result: 0
Input: [[-25, -26], [34, -27]]
Result: 0
Input: [[-6, -14], [-48, -45], [21, 25]]
Result: 400
Input: [[4, 30], [5, 37], [-18, 49], [-9, -2]]
Result: 562
Input: [[0, 16], [24, 18], [-43, 36], [39, -29], [3, -38]]
Result: 2978
Input: [[19, -19], [15, 5], [-16, -41], [6, -25], [-42, 1], [12, 19]]
Result: 2118
Input: [[-23, 13], [-13, 13], [-6, -7], [22, 41], [-26, 50], [12, -12], [-23, -7]]
Result: 2307
Input: [[31, -19], [-41, -41], [25, 34], [29, -1], [42, -42], [-34, 32], [19, 33], [40, 39]]
Result: 6037
Input: [[47, 1], [-22, 24], [36, 38], [-17, 4], [41, -3], [-13, 15], [-36, -40], [-13, 35], [-25, 22]]
Result: 3908
Input: [[29, -19], [18, 9], [30, -46], [15, 20], [24, -4], [5, 19], [-44, 4], [-20, -8], [-16, 34], [17, -36]]
Result: 2905
[[0, 0], [1, 1], [0, 1]]
действительно должен давать а не . 0Ответы:
SQL Server 2012+, 84 байта
Использует геометрические функции и агрегаты в SQL Server. Координаты из таблицы
A
с колонкамиx
иy
.источник
Java 10,
405... больше не подходит; см. историю изменений ..317316 байт-52 байта благодаря @ OlivierGrégoire
-3 байта благодаря @PeterTaylor
-7 байтов благодаря @ceilingcat
Попробуйте онлайн.
Или 299 байт без округления .. .
Объяснение:
Есть три шага:
Чтобы вычислить координаты, которые являются частью выпуклой оболочки, мы используем следующий подход:
Установите точки и в крайнюю левую координату. Затем вычислите следующую точку в повороте против часовой стрелки; и продолжайте делать это, пока мы не достигнем начальной точки . Вот визуал для этого:l p p l
Что касается кода:
источник
Wolfram Language (Mathematica) , 27 байт
Попробуйте онлайн!
источник
JavaScript (ES6),
191189 байтРеализует марш Джарвиса (он же алгоритм упаковки подарков).
Попробуйте онлайн!
Или 170 байтов без громоздкой схемы округления.
источник
R ,
858178 байтПопробуйте онлайн!
Принимает входные данные в виде матрицы из 2 столбцов - сначала для
x
, затем дляy
. Наround
самом деле R's использует метод округления банкира, поэтому нам здесь очень повезло.Код использует встроенную функцию, чтобы определить, какие точки образуют выпуклый корпус, а затем применяет стандартную формулу чтобы получить площадь поверхности многоугольника.∑i(xi−1+x)⋅(yi−1−yi)/2
Спасибо Джузеппе за -3 байта.
источник
[Пакет R + sp], 55 байт
Попробуйте это в RDRR
Функция, которая принимает матрицу тревог 2 и возвращает округленную площадь. Это использует
sp
пакет.drop=F
Нужно обрабатывать случай один координатного. RDRR используется для демонстрации, так как TIO не хватаетsp
пакета.источник