Breve explicación del problema
Escriba un programa para encontrar la distancia mínima entre dos puntos que viajan solo en rayos que emanan del origen y círculos centrados en el origen.
Explicación de la premisa
Ahora imaginemos que estamos en un avión, y en este avión solo se nos permite viajar de maneras especiales. Se nos permite viajar en cualquier rayo que provenga del origen.
También podemos viajar en cualquier círculo centrado en un círculo
Ahora nuestro objetivo es viajar de un punto de este avión a otro. Sin embargo, no podemos simplemente viajar en un sendero euclidiano simple, solo podemos hacer esto si los puntos caen en un rayo que emana del centro.
Podemos viajar en este porque cae en uno de nuestros rayos.
También podemos viajar en círculos centrados en el origen.
Ejemplos
Ahora aquí está el desafío:
Tenemos que ir de un punto a otro en el camino más corto; a menudo es una combinación de viajar en círculos y rayos.
Esto, sin embargo, también podría estar viajando en dos rayos.
A veces existen dos caminos que recorren la distancia mínima.
Problema
Su desafío es escribir un programa que cuando se le den dos puntos nos dará la distancia mínima entre ellos si seguimos estas reglas. Las entradas se pueden dar en forma rectangular o polar y la salida debe ser un número, la distancia entre ellos.
Casos de prueba
(con entrada rectangular)
(1,1) (1,-1) -> ~ 2.22144
(0,0) (1, 1) -> ~ 1.41421
(1,0) (-0.4161 , 0.90929) -> ~ 2
(1,1) (1, 0) -> ~ 1.19961
(1,2) (3, 4) -> ~ 3.16609
fuente
Respuestas:
Haskell,
4948 bytesUso:
Gracias a @Zgarb por guardar un byte
fuente
(a!q)c r
lugar ded a q c r
.JavaScript (ES6), 65 bytes
Toma coordenadas polares. Utiliza el truco de @Angs para reducir un ángulo entre 0 y π. Para coordenadas rectangulares, algo como esto funciona:
fuente
MATL , 22 bytes
La entrada es una matriz de dos números complejos.
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
Ruby, 64 bytes
Primero, mi sumisión. Función lambda con argumentos
distance 1, angle 1, distance 2, angle2
.Ahora aquí hay dos soluciones diferentes de 66 bytes (excluyendo la asignación
f=
) seguidas de mi envío real nuevamente a 64 bytes.El envío se basa en la solución 2, pero utiliza la identidad
(s-r).abs
=s+r-[s,r].min*2
para acortar el código en 2 bytes, de ahí el-2
interior de los corchetes.La otra característica notable es la expresión
?i.to_c.arg*4
= 2 * PI sin usarinclude Math
. Si se acepta una precisión menor, esto puede ser reemplazado por un literal.Solución 2 comentada en el programa de prueba
Salida
fuente
Mathematica 66 Bytes
Esto toma coordenadas rectangulares y puede generar una solución simbólica exacta
Uso:
rendimientos:
N @% rendimientos:
{2.221441469, 1.414213562, 1.999934259, 1.199611726, 3.166096674}
fuente
Python 2,
164126125132 bytes:Sin embargo, actualmente estoy estudiando esto más. Acepta coordenadas polares. Debe llamarse en el formato
A(r1,θ1,r2,θ2)
. Emite un valor de coma flotante preciso hasta12
cifras significativas.¡Pruébelo en línea! (Ideona)
Una implementación simple y directa que calcula y genera en STDOUT el valor mínimo de una matriz de como máximo 3 valores que contienen:
r1+r2
) o la longitud del arco que conecta los dos puntos iffr1==r2
;abs(r1-r2)
) iffθ1==θ2
(es decir, los dos puntos son colineales);''
) como aparentemente en Python una cadena es mayor que cualquier número entero;fuente
math.pi
?Wolfram Language (Mathematica) , 47 bytes
Pruébalo en línea!
(supera la respuesta actual de 66 bytes)
Tome la entrada como 2 números complejos.
Puede tener algunos problemas si la entrada es simbólica. (por ejemplo,
Cos@2 + I Sin@2
)fuente