Задача состоит в том, чтобы найти самый маленький диск, содержащий несколько заданных точек. Однако это несколько усложняется тем, что в этой задаче координаты и радиус диска должны быть целыми числами.
Ваш ввод будет список точек с целочисленными координатами x
и y
. Вы можете принять это как список кортежей, список списков или любой другой способ представления коллекции пар. x
и y
оба будут (возможно, отрицательными) целыми числами. Каждая точка гарантированно уникальна, и будет хотя бы одна точка.
Ваш выход будет диск в виде трех чисел, X
, Y
, и R
. X
,, Y
и R
все целые числа, X
и Y
представляют центр диска и R
представляет его радиус. Расстояние между каждой данной точкой и центром должно быть меньше или равно R
, и не должно быть такого диска с меньшим, R
который также удовлетворяет этому условию.
Возможно, что для данного ввода будет несколько возможных решений, в этом случае ваш код должен вывести хотя бы одно из них.
Вы можете использовать любые виды геометрии, которые поддерживает ваш язык, если они есть, и ввод / вывод может осуществляться через встроенные точечные / дисковые объекты, а не только числа.
Тестовые случаи
Input (Possible) Output(s)
(x,y) (X,Y,R)
-------------------------
(0,0) (0,0,0)
-------------------------
(0,1) (0,0,1)
(1,0) (1,1,1)
-------------------------
(1,4) (4,4,3)
(3,2)
(4,1)
(4,5)
(5,2)
(7,4)
-------------------------
(-1,0) (0,0,2)
(2,0) (1,0,2)
-------------------------
(-1,0) (1,0,2)
(2,1) (0,1,2)
-------------------------
(0,0) (1,0,1)
(1,1) (0,1,1)
Побеждает несколько байтов.
Ответы:
Желе ,
252422212018 байтСпасибо @EriktheOutgolfer за сообщение об
)
экономии 1 байта.Спасибо @Dennis за сохранение 2 байта.
Попробуйте онлайн!
объяснение
источник
€
?Brachylog v2, 19 байт
Попробуйте онлайн!
Эту программу было легко написать - Brachylog почти идеально подходит для такого рода проблем - но трудно для гольфа. Меня не удивит, если где-то здесь сохранится байт, так как некоторые вещи, которые я делал, оказали какое-либо влияние (и содержат инструкции вложенной карты, обычно это признак того, что вы должны использовать member / findall, но я не могу увидеть способ сделать это).
Это функция представления. Ввод осуществляется из левого аргумента функции в формате
[[x,y],[x,y],…]
, вывод из правого аргумента в форме[r,[[x,y]]]
. (Если вы хотите попробовать отрицательные числа во входных данных, обратите внимание, что Brachylog использует_
для знака минус, а не-
. Это сбивает с толку, потому что функция → полная программа-оболочка, с которой поставляется Brachylog, запрошенная с помощью аргумента командной строкиZ
, будет представлять отрицательные числа в выходной с обычным знаком минус.)объяснение
Это интересно тем, что мы просим Brachylog найти значение определенных свойств (в данном случае радиус диска с центром в точке,
A
которая соответствует всем входным точкам), но вряд ли предъявляем к нему какие-либо требования (все, что нам нужно, это что радиус это число). Однако Brachylog будет внутренне вычислять рассматриваемый радиус символически, а не пытаться использовать конкретные числа, поэтому, когда≜
достигается окончательный результат , он выполняет две вещи одновременно: во-первых, он гарантирует, что только целые числа используются для координатA
и для радиуса (сделать квадрат радиуса квадратным числом и объяснить, как использовать≤ᵛ
«максимум или больше»); во-вторых, он находит наименьший возможный жизнеспособный радиус (поскольку радиус выводится первым в выходных данных).Одна вещь, которая вообще не указана в программе, состоит в том, что все точки измеряются относительно одного и того же центра диска; как написано, нет никаких ограничений, что мы не используем разные центры для каждой точки. Однако порядок разрыва
ᵐ
связей (который в этом случае устанавливается третьим и который в качестве структурного ограничения будет оцениваться до ограничения значения, подразумеваемого≜
) хочетA
быть как можно более коротким (т. Е. Одним элементом, поэтому мы используем тот же самый center каждый раз,A
сначала он пробует нулевую длину, но это, очевидно, не работает, поэтому он пробует следующий список. В результате мы получаем полезное ограничение (что у нас есть только один диск) «бесплатно».Такое решение обобщает любое количество измерений без изменений в исходном коде; здесь нет никаких предположений, что вещи двумерны. Так что, если вам понадобится наименьшая целочисленная сфера, вы тоже можете это иметь.
источник
Perl 6 , 81 байт
Попробуйте онлайн!
Принимает список точек в виде 2-элементных списков
((X1, Y1), (X2, Y2), ...)
. Возвращает список(R, (X, Y))
. Использует тот же подход, что и ответ Jelly от Pietu1998:minmax
Метод полезен здесь , как это возвращаетRange
. Декартово произведение диапазонов непосредственно дает все точки с целочисленными координатами.источник
05AB1E , 26 байт
Порт @ Pietu1998 Желе ответ .
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Matlab, 73 байта
Просто найдите наименьшее решение (с плавающей точкой) и округлите до ближайшей точки, а затем закройте радиус (наихудший случай для минимаксной задачи). Я точно не знаю, дает ли это правильное решение для всех возможных случаев (в пределах точности), но для тестовых случаев это должно сработать (если я не допустил опечатки).
Позвони с
источник
fminimax
Pyth ,
3433 байтаВывод в виде
[R,x,y]
Попробуйте онлайн здесь или проверьте все тестовые примеры сразу здесь .
Редактирование: Сохранение байта путем изменения формата вывода, предыдущая версия:
heDm+d.EeSm@s^R2-Vdk2Q*Fm}FhM_BSdC
источник
Wolfram Language (Mathematica) , 66 байт
Вот подход грубой силы. Я рассмотрел гораздо более короткую
BoundingRegion[#,"MinDisk"]&
функцию, но нет способа принудительно задать целочисленные координаты и радиус.Попробуйте онлайн!
источник
{Round@#[[1]], Ceiling@#[[2]]} &@BoundingRegion[#, "MinDisk"]&
?Java 10,
283279277257 байт-20 байт благодаря @nwellnhof кончик «s использования
Math.hypot
.Массив результатов находится в порядке
[R,X,Y]
.Попробуйте онлайн.
Объяснение:
источник
Math.hypot
.Math.hypot
, что идеально подходит для этой задачи! -20 байтов прямо там. Спасибо. :)Javascript, 245 байт
(Несколько) более читаемая версия:
Просто находит ограничивающую рамку и проверяет каждую координату в этой рамке на предмет того, является ли она лучшей.
Я мог бы сэкономить 8 байтов с приблизительным ответом, заменив:
Math.ceil(Math.sqrt(n[2]))
с~~(n[2]+1-1e-9)
источник
for(f=c;f<b;f++){for(g=e;g<d;g++){s=a.reduce((o,[p,q])=>o>(r=(p-f)**2+(q-g)**2)?o:r);n=n?n[2]>s?[f,g,s]:n:[f,g,s]}}
наfor(f=c;f<b;f++)for(g=e;g<d;n=n?n[2]>s?[f,g,s]:n:[f,g,s],g++)s=a.reduce((o,[p,q])=>o>(r=(p-f)**2+(q-g)**2)?o:r);
. И я почти уверен, что вы можете удалить место вreturn[
.Math.hypot
.Рубин , 113 байт
Попробуйте онлайн!
источник
Древесный уголь , 65 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Получить координаты у в
z
.Получить X-координаты в
h
.Цикл по включенным диапазонам от минимумов до максимумов
h
иz
создание списка всех потенциальных центров диска.Обведите все центры диска, затем обведите все исходные точки, затем обведите обе координаты, вычтите, возведите в квадрат, суммируйте, возьмите максимум и сохраните полученный список.
Найдите положение минимального максимального диаметра и напечатайте соответствующий центр диска.
Выведите минимальный максимальный диаметр, но округлите его до следующего целого числа.
источник