Eres el dueño de un restaurante. Está abriendo en una nueva área en Cartesia donde solo hay una carretera principal, conocida como el eje y. Desea colocar su restaurante de manera que minimice la distancia total desde su restaurante y cada una de las casas en esa área.
Entrada :
La entrada será
n, the number of houses
house1
house2
house3
...
houseN
donde cada casa es una coordenada en la forma x y
. Cada unidad representa un kilómetro.
Puede tomar la entrada como una cadena o proporcionar una función que tome la entrada, en cualquier formato que elija, como sus argumentos.
Salida : la coordenada y de su restaurante (recuerde, se ubicará en el eje y). En realidad, se ubicará al costado de la carretera, pero la diferencia es insignificante.
Esencialmente, si la enésima casa es h_n
y D
es la función de distancia, entonces desea encontrar k
tal queD(h_0, (0, k)) + D(h_1, (0, k)) + D(h_2, (0, k)) + ... + D(h_n, (0, k))
esté minimizada.
Tenga en cuenta que la distancia se calcula como si el cliente viaja en línea recta desde su casa hasta el restaurante. Esa es la distancia desde (x, y)
su restaurante essqrt(x^2 + (y - k)^2)
.
La salida debe tener una precisión de al menos 2 decimales.
La salida puede imprimirse como una cadena o puede devolverse desde la función.
Ejemplo de entrada / salida:
Input:
2
5.7 3.2
8.9 8.1
Output:
5.113013698630137
La distancia total en este ejemplo es de aproximadamente 15.4003
kilómetros.
Este es el código de golf: el código más corto gana.
PD: También estoy interesado en una solución matemática que no sea solo la fuerza bruta. No ganará el código de golf, pero obtendrá algunos votos positivos. Así es como hice el problema de ejemplo:
Deje que el punto A se ubique en A (5.7, 3.2) y B en B (8.9, 8.1). Deje que la solución apunte a (0, k) sea C. Refleje A sobre el eje y para hacer A 'en (-5.7, 3.2). La distancia de A 'a C es igual a la distancia de A a C. Por lo tanto, el problema puede reducirse al punto C de manera que se minimice A'C + CB. Obviamente, este sería el punto C que se encuentra en la línea A'B.
No sé si esto se generalizaría bien a 3 o más puntos.
fuente
D
? Euclidiana?sqrt(diffX^2 + diffY^2)
? Entonces euclidiano. Sé que no encaja perfectamente en el escenario, pero supongo que el cliente viaja en línea recta de alguna manera desde su casa.Respuestas:
C,
315302 bytesEsto está lejos de ser bonito, y tampoco es corto. Pensé que como no voy a ganar el concurso de longitud, ¡puedo intentar ganar el concurso de precisión (teórica)! El código es probablemente un orden de magnitud o dos más rápido que la solución de fuerza bruta, y se basa en un poco de tontería matemática.
Definimos una función
g(N,S)
que toma como entrada el número de casasN
, y un conjunto de casas.S[][2]
.Aquí está descifrado, con un caso de prueba:
Qué salidas:
Advertencia: ¡Se requiere conocimiento de algunos cálculos para una comprensión completa!
Entonces, hablemos de las matemáticas.
Conocemos la distancia desde nuestro punto deseado
(0, k)
y una casai
:Y así, la distancia total
D
desde lasn
casas se puede definir de la siguiente manera:Lo que nos gustaría hacer es minimizar esta función tomando una derivada con respecto a
k
y estableciéndola igual a0
. Vamos a intentarlo. Sabemos que las derivadas deD
se pueden describir de la siguiente manera:Pero la primera derivada parcial de cada uno
Di
es bastante mala ...Desafortunadamente, incluso con
n == 2
, establecer estos derivados0
y resolverlos sek
vuelve desastroso muy rápidamente. Necesitamos un método más robusto, incluso si requiere alguna aproximación.Entra Taylor Polynomials.
Si conocemos el valor
D(k0)
y todosD
los derivados dek0
, podemos reescribirD
como una serie de Taylor:Ahora, esta fórmula tiene un montón de cosas en ella, y sus derivados pueden volverse bastante difíciles de manejar, pero ahora tenemos una aproximación polinómica de
D
!Haciendo un poco de cálculo, encontramos las siguientes dos derivadas
D
al evaluar las derivadas deDi
, como antes:Al truncar y evaluar las derivadas, ahora podemos aproximarnos
D
como un polinomio de tercer grado de la forma:¿Dónde
A, B, C, D
están simplemente los números reales?Ahora esto podemos minimizarlo. Cuando tomamos una derivada y la establecemos igual a 0, terminaremos con una ecuación de la forma:
Haciendo el cálculo y las sustituciones, se nos ocurren estas fórmulas para
a, b, and c
:Ahora nuestro problema nos da 2 soluciones dadas por la fórmula cuadrática:
La fórmula completa para
k
sería una carga enorme de escribir, por lo que lo hacemos en pedazos aquí y en el código.Como sabemos que cuanto más alto
k
siempre dará como resultado la distancia mínima de nuestro aproximadoD
(tengo una prueba realmente maravillosa de esto, que el margen de este documento es insuficiente para contener ...) ni siquiera tenemos que considerar el más pequeño de las soluciones.Queda un último problema. Para fines de precisión, es necesario que comencemos con un
k0
que esté al menos en el estadio de donde esperamos que esté la respuesta. Para este propósito, mi código elige la media geométrica de los valores y de cada casa.Como a prueba de fallas, repetimos todo el problema nuevamente 9 veces, reemplazando
k0
conk
cada iteración, para garantizar la precisión.No he hecho los cálculos sobre cuántas iteraciones y cuántos derivados son realmente necesarios, pero he optado por errar por precaución hasta que pueda confirmar la precisión.
Si lo lograste conmigo, ¡muchas gracias! Espero que haya entendido, y si detecta algún error (de los cuales probablemente haya muchos, estoy muy cansado), ¡hágamelo saber!
fuente
TI-BASIC, 20
Toma información en la pantalla de inicio de su calculadora de la serie TI-83 u 84 de esta forma (puede escribir una
2:
primera, que sería ignorada):Si las casas están siempre a menos de mil millones de kilómetros del origen, E99 se puede reemplazar por E9 para un tamaño de 18 bytes.
Si hubiera un lenguaje de golf basado en Mathematica, podría ganar este desafío en 10-14 bytes.
fuente
Mathematica, 42 bytes
Esta es una función anónima que toma una lista de pares como coordenadas de la casa y devuelve la coordenada y deseada.
Es una implementación bastante sencilla. Mapeamos
Norm[#-{0,k}]&
en cada coordenada de la casa (que calcula la distancia a un punto indeterminado{0,k}
en el eje y) y los sumamos a todosTr[...]
(para trazar, que es equivalente a lasTotal
listas 1-d). Luego usamos el convenienteMinimize
para encontrar el mínimo de esta suma enk
. Esto da un resultado del formulario{distance, {k -> position}
, por lo que necesitamosk/.Last@
extraer elposition
que estamos buscando.fuente
Pyth, 33 bytes
Esta es la solución de fuerza bruta: ordena todas las ubicaciones posibles del restaurante, con una resolución de 0,001 km, por su distancia total de las casas, luego selecciona la que tenga la menor distancia total. Toma las ubicaciones de la casa como una lista de 2 listas de entradas de carrozas en STDIN.
Demostración.
La resolución se puede establecer en cualquier lugar de 1e-2 km a 1e-10 km con la misma longitud de código, pero con ralentizaciones exponenciales en tiempo de ejecución.
Siento que esto podría jugarse un poco más, lo volveré a ver más tarde.
fuente
^T3
es especialmente impresionante.Pitón 2, 312
fuente
R,
145143126Sospecho que queda mucho espacio para jugar al golf. Prácticamente un método de fuerza bruta. Me gustaría encontrar una mejor manera de hacer esto. Pensé que los medios geométricos podrían ayudar, pero por desgracia no.
Prueba de funcionamiento
Como cuestión de interés, si solo hay dos casas a considerar, lo siguiente arrojará un resultado aceptable. Sin embargo, cae sobre tres. No puedo ir más lejos en este momento, pero pensé que algunos de los cerebros aquí podrían hacer algo con él.
fuente
MATLAB, 42
Si está bien tomar la entrada como
entonces esta declaración
vuelve
5.113014445748538
.Robando descaradamente el método de Thomas Kwa, puedes reducirlo a 30 al menos:
fuente
n
número de casa? Ya que es lo que pide la pregunta.I
.