Una montaña se define como un conjunto de segmentos de línea cuyo primer punto tiene coordenadas (0,a)
donde a > 0
, y cuyo último punto tiene coordenadas (b,0)
, dónde b > 0
. Todos los puntos intermedios tienen una coordenada y (ordenada) estrictamente mayor que 0. Se le dan los puntos en la montaña ordenados en orden ascendente de la coordenada x (abscisa). Tenga en cuenta que dos puntos pueden tener la misma coordenada x, produciendo un segmento vertical de la montaña. Si se le dan dos puntos con la misma coordenada x, se deben conectar en el orden en que se dan. Además, puede haber segmentos horizontales de la montaña. Estos segmentos horizontales no están iluminados, pase lo que pase. Todas las coordenadas son enteros no negativos.
La pregunta: ¿cuál es la longitud total de la montaña que se iluminaría, suponiendo que el sol sea un plano de luz vertical infinito ubicado a la derecha de la montaña? Este número no necesita ser redondeado, pero si es redondeado, incluya al menos cuatro decimales. He incluido una imagen: aquí, las líneas en negrita representan los segmentos que están encendidos. Tenga en cuenta que en la entrada, P aparece antes que Q (PQ es un segmento de línea vertical), por lo que el punto anterior está conectado a P y no a Q.
Puede tomar la entrada en cualquier formato razonable, como una lista de listas, una sola lista, una cadena, etc.
Caso de prueba:
(0,3000)
(500, 3500)
(2500, 1000)
(5000,5000)
(9000,2000)
(9000,3500)
(10200,0)
Output: 6200.0000
Aquí hay dos segmentos iluminados, como se muestra en esta imagen: el primero tiene una longitud de 5000/2 = 2500 y el segundo tiene una longitud de 3700.
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
(x1, y1)
y(x2,y2)
. El punto que está "bloqueando" es(x3, y3)
. Suponga que y2 <y3 <= y1. Entonces la longitud del segmento es((y1 - y3)/(y1 - y2))*sqrt((x1 - x2)^2 + (y1 - y2)^2)
. fórmula de distancia, multiplicada por la fracción del segmento que se usa realmente.Respuestas:
Python 2 ,
134 131 128 124 120 117 109107 bytesPruébalo en línea!
Toma información como una lista de tuplas / listas de dos elementos de números de punto flotante.
Explicación
for
Matemáticas: ¿qué parte del segmento de línea está expuesta a la luz?
Al unir las dos fórmulas, llegamos a la siguiente expresión, que es el núcleo de este enfoque:
Código - ¿Cómo funciona?
Registro de cambios
Gradualmente optimizado la fórmula para fines de golf.
Guardado 1 byte gracias a FlipTack .
Se ahorraron 2 bytes al eliminar la condición innecesaria que
y>Y
, dado que si los máximos locales de la coordenada Y después del punto actual restadoy
son positivos, entonces esa condición es redundante. Sin embargo, esto desafortunadamente invalida el golf de FlipTack.Guardamos 3 bytes cambiando un poco el algoritmo: en lugar de tener una variable de contador, incrementándola y siguiendo la lista, eliminamos el primer elemento en cada iteración.
Guardado 8 bytes gracias a ovs ; cambiando
(x,y),(X,Y)
en la condición del bucle con unalist.pop()
técnica.Ahorró 2 bytes gracias a Ørjan Johansen (optimizó un poco la fórmula).
fuente
JavaScript, 97 bytes
(Se pueden guardar 5 bytes si se considera válida la versión invertida de la entrada).
fuente
APL + WIN, 48 bytes
Solicita una lista de coordenadas x seguida de una lista de coordenadas y
Explicación
Las distancias verticales iluminadas = h y las distancias horizontales iluminadas son (3) * (1) / (2). El resto es Pitágoras.
fuente
+/.5*⍨(h*2)+×⍨((h←-2-/⌈\m)÷-2-/m←⌽⎕)×⌽-2-/⎕
?⍨
operador, de modo que no puedo decirSwift , 190 bytes
Pruébalo en línea!
Explicación
fuente
Python 2 ,
122120 bytesPruébalo en línea!
fuente
[::-1]
.Python 2 , 89 bytes
Pruébalo en línea!
Toma una lista de pares de carrozas. Basado en la solución de ovs .
fuente
[::-1]
.APL (Dyalog Unicode) , SBCS de 31 bytes
Utiliza la fórmula de Graham .
Función de prefijo anónimo que toma una matriz de datos 2 × n como argumento correcto. La primera fila contiene valores x de derecha a izquierda, y la segunda fila los valores y correspondientes.
Pruébalo en línea!
{
...}
anónimo lambda donde⍵
está el argumento:2-/⍵
deltas (lit. por parejas menos reducciones)÷⌿
Δx ⁄ Δy (lit. reducción de división vertical)×⍨
cuadrado (literalmente, multiplicación selfie)1+
uno agregado a eso(
...)×
multiplique lo siguiente con eso:2⌷⍵
segunda fila del argumento (los valores y)⌈\
máximo de carrera (altura más alta alcanzada hasta ahora, yendo desde la derecha)2-/
deltas de (lit. por pares menos reducción)×⍨
cuadrado (literalmente, multiplicación selfie).5*⍨
raíz cuadrada (literalmente, eleva eso a la potencia de la mitad)+/
sumafuente
Jalea , 23 bytes
Un enlace diádico que toma una lista de valores de y a la izquierda y una lista de los respectivos valores de x a la derecha (como lo permite explícitamente el OP en los comentarios)
Pruébalo en línea!
¿Cómo?
La fracción de una sección (inclinada) que se ilumina es la misma fracción que se iluminaría si fuera una caída vertical. Tenga en cuenta que, dado que se produce la cuadratura para evaluar las longitudes de las pendientes, las alturas calculadas a lo largo del camino pueden ser negativas (también en el siguiente, las longitudes de recorrido de las pendientes iluminadas se calculan como negativas divididas por negativas).
Versión monádica de 25 bytes que toma una lista de
[x,y]
coordenadas:Prueba este.
fuente
⁸
s y⁹
s.Kotlin , 178 bytes
Pruébalo en línea!
La parte de prueba es mucho menos golf :)
fuente