Este desafío consiste en encontrar el disco más pequeño que contenga algunos puntos dados. Sin embargo, esto se hace algo más complicado por el hecho de que en este desafío, las coordenadas y el radio del disco deben ser enteros.
Su entrada será una lista de puntos con coordenadas enteras x
y y
. Puede tomar esto como una lista de tuplas, una lista de listas o cualquier otra forma de representar una colección de pares. x
y y
ambos serán enteros (posiblemente negativos). Se garantiza que cada punto sea único, y habrá al menos un punto.
Su salida será un disco en forma de tres números, X
, Y
, y R
. X
, Y
Y R
son todos los enteros, X
y Y
representan el centro del disco y R
representa su radio. La distancia entre cada punto dado y el centro debe ser menor o igual que R
, y no debe existir un disco con un tamaño menor R
que también satisfaga esta condición.
Es posible que haya múltiples soluciones posibles para una entrada dada, su código debe generar al menos una de ellas en este caso.
Puede usar cualquier tipo de geometría incorporada que su lenguaje admita si las hay, y la entrada / salida puede ser a través de objetos de punto / disco integrados en lugar de solo números.
Casos de prueba
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)
Pocos bytes ganan.
Respuestas:
Jalea ,
252422212018 bytesGracias a @EriktheOutgolfer por informarme sobre cómo
)
guardar 1 byte.Gracias a @Dennis por guardar 2 bytes.
Pruébalo en línea!
Explicación
fuente
€
?Brachylog v2, 19 bytes
Pruébalo en línea!
Este programa fue fácil de escribir, Brachylog es casi perfecto para este tipo de problema, pero difícil de jugar. No me sorprendería si hubiera un byte guardado en algún lugar aquí, ya que pocas cosas que hice parecían tener algún efecto (y contiene instrucciones de mapa anidadas, normalmente una señal de que debería estar usando member / findall, pero no puedo ver una forma de hacerlo).
Esta es una presentación de función. La entrada es del argumento izquierdo a la función en el formato
[[x,y],[x,y],…]
, la salida del argumento derecho en el formulario[r,[[x,y]]]
. (Si desea probar números negativos en la entrada, tenga en cuenta que Brachylog usa_
para el signo menos, no-
. Esto es confuso porque la función → envoltura completa del programa con la que se entrega Brachylog, solicitada usando el argumento de la línea de comandosZ
, presentará números negativos en la salida con un signo menos regular).Explicación
Esto es interesante porque le estamos pidiendo a Brachylog que encuentre un valor de ciertas propiedades (en este caso, el radio de un disco centrado en el punto
A
que se ajusta a todos los puntos de entrada), pero casi no tenemos ningún requisito (todo lo que necesitamos es que el radio es un número). Sin embargo, Brachylog calculará internamente el radio en cuestión simbólicamente en lugar de tratar de usar números concretos, por lo que cuando≜
se alcanza el final , logra dos cosas a la vez: primero, asegura que solo se usen números enteros para las coordenadas delA
radio y (obligando al radio al cuadrado a ser un número cuadrado, y explicando el uso de≤ᵛ
para encontrar un "máximo o mayor"); segundo, encuentra el radio viable más pequeño posible (ya que el radio viene primero en la salida).Una cosa que no se especifica en el programa es que todos los puntos se miden contra el mismo centro de un disco; como está escrito, no hay restricciones de que no usemos un centro diferente para cada punto. Sin embargo, el orden de desempate (que en este caso se establece por el tercero
ᵐ
, y que como una restricción de estructura se evaluará antes de que la restricción de valor implícita≜
) quieraA
ser lo más corto posible (es decir, un solo elemento, entonces usamos el mismo centrar cada vez;A
primero intenta una longitud cero, pero eso obviamente no funciona, por lo que intenta una lista singleton a continuación). Como resultado, terminamos obteniendo una restricción útil (que solo tenemos un disco) "gratis".Esta solución pasa a generalizarse a cualquier cantidad de dimensiones , sin cambios en el código fuente; No hay suposiciones aquí de que las cosas son bidimensionales. Entonces, si necesita la esfera entera más pequeña, también puede tenerla.
fuente
Perl 6 , 81 bytes
Pruébalo en línea!
Toma una lista de puntos como listas de 2 elementos
((X1, Y1), (X2, Y2), ...)
. Devuelve una lista(R, (X, Y))
. Utiliza el mismo enfoque que la respuesta Jelly de Pietu1998:El
minmax
método es útil aquí ya que devuelve aRange
. El producto cartesiano de rangos produce directamente todos los puntos con coordenadas enteras.fuente
05AB1E , 26 bytes
Puerto de la respuesta Jelly de @ Pietu1998 .
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Matlab, 73 bytes
Simplemente encuentre la solución más pequeña (punto flotante) y redondee al punto más cercano y limite el radio (el peor de los casos para el problema minimax). No estoy seguro si eso proporciona la solución correcta para todos los casos posibles (dentro de la precisión), pero para los casos de prueba debería funcionar (si no cometí un error de tipeo).
Llámalo con
fuente
fminimax
Pyth ,
3433 bytesLa salida está en forma
[R,x,y]
Pruébelo en línea aquí , o verifique todos los casos de prueba a la vez aquí .
Editar: guardado un byte reorganizando el formato de salida, versión anterior:
heDm+d.EeSm@s^R2-Vdk2Q*Fm}FhM_BSdC
fuente
Wolfram Language (Mathematica) , 66 bytes
Aquí hay un enfoque de fuerza bruta. Consideré la
BoundingRegion[#,"MinDisk"]&
función mucho más corta , pero no hay forma de forzar coordenadas y radios enteros.Pruébalo en línea!
fuente
{Round@#[[1]], Ceiling@#[[2]]} &@BoundingRegion[#, "MinDisk"]&
?Java 10,
283279277257 bytes-20 bytes gracias a la sugerencia de uso de @nwellnhof
Math.hypot
.La matriz de resultados está en el orden
[R,X,Y]
.Pruébalo en línea.
Explicación:
fuente
Math.hypot
.Math.hypot
, ¡lo cual es perfecto para este desafío! -20 bytes justo allí. Gracias. :)Javascript, 245 bytes
(Algo) versión más legible:
Simplemente encuentra el cuadro delimitador y prueba cada coordenada en ese cuadro para ver si es la mejor.
Podría ahorrar 8 bytes con una respuesta aproximada, reemplazando:
Math.ceil(Math.sqrt(n[2]))
con~~(n[2]+1-1e-9)
fuente
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]}}
afor(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);
. Y estoy bastante seguro de que puedes eliminar el espacio enreturn[
.Math.hypot
.Ruby , 113 bytes
Pruébalo en línea!
fuente
Carbón , 65 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Obtenga las coordenadas y en
z
.Obtenga las coordenadas x en
h
.Recorra los rangos inclusivos desde los mínimos hasta los máximos
h
yz
genere la lista de todos los centros de discos potenciales.Pase por todos los centros de disco, luego pase por todos los puntos originales, luego pase por ambas coordenadas, reste, cuadre, sume, tome el máximo y guarde la lista resultante.
Encuentre la posición del diámetro máximo mínimo e imprima el centro del disco correspondiente.
Imprima el diámetro máximo mínimo, pero redondee al siguiente número entero.
fuente