Uma montanha é definida como um conjunto de segmentos de linha cujo primeiro ponto possui coordenadas (0,a)
onde a > 0
e cujo último ponto possui coordenadas (b,0)
onde b > 0
. Todos os pontos intermediários têm uma coordenada y (ordenada) estritamente maior que 0. Você recebe os pontos na montanha classificados em ordem crescente da coordenada x (abcissa). Observe que dois pontos podem ter a mesma coordenada x, produzindo um segmento vertical da montanha. Se você receber dois pontos com a mesma coordenada x, eles deverão ser conectados na ordem em que são dados. Além disso, pode haver segmentos horizontais da montanha. Esses segmentos horizontais não estão acesos, não importa o quê. Todas as coordenadas são números inteiros não negativos.
A pergunta: qual é o comprimento total da montanha que seria iluminada, supondo que o sol seja um plano vertical infinito de luz localizado à direita da montanha? Esse número não precisa ser arredondado, mas se for arredondado, inclua pelo menos quatro casas decimais. Incluí uma figura: Aqui, as linhas em negrito representam os segmentos acesos. Observe que, na entrada, P aparece antes de Q (PQ é um segmento de linha vertical), portanto o ponto anterior é conectado a P e não a Q.
Você pode receber informações em qualquer formato razoável, como uma lista de listas, uma única lista, uma string, etc.
Caso de teste:
(0,3000)
(500, 3500)
(2500, 1000)
(5000,5000)
(9000,2000)
(9000,3500)
(10200,0)
Output: 6200.0000
Existem dois segmentos iluminados aqui, como mostrado nesta imagem: O primeiro tem comprimento 5000/2 = 2500 e o segundo tem comprimento 3700.
Isso é código-golfe , então a resposta mais curta em bytes vence.
(x1, y1)
e, e(x2,y2)
o ponto que está "bloqueando" é(x3, y3)
. Suponha y2 <y3 <= y1. Então o comprimento do segmento é((y1 - y3)/(y1 - y2))*sqrt((x1 - x2)^2 + (y1 - y2)^2)
. fórmula de distância, multiplicada pela fração do segmento que é realmente usado.Respostas:
Python 2 ,
134 131 128 124 120 117 109107 bytesExperimente online!
Recebe entrada como uma lista de tuplas / listas de dois elementos de números de ponto flutuante.
Explicação
for
Matemática - Que parte do segmento de linha é exposta à luz?
Juntando as duas fórmulas, chegamos à seguinte expressão, que é o núcleo dessa abordagem:
Código - Como funciona?
Changelog
Gradualmente otimizada a fórmula para fins de golfe.
Economizou 1 byte graças ao FlipTack .
Salva 2 bytes removendo a condição desnecessária de que
y>Y
, uma vez que se o máximo local da coordenada Y após o ponto atual subtraídoy
for positivo, essa condição será redundante. Infelizmente, isso invalida o golfe do FlipTack.Economizamos 3 bytes alterando um pouco o algoritmo: em vez de ter uma variável de contador, incrementando-a e seguindo a lista, removemos o primeiro elemento a cada iteração.
Economizou 8 bytes graças ao ovs ; mudança
(x,y),(X,Y)
na condição do loop com umalist.pop()
técnica.Economizou 2 bytes graças a Ørjan Johansen (otimizou um pouco a fórmula).
fonte
JavaScript, 97 bytes
(5 bytes podem ser salvos, se considerar válida a versão invertida da entrada.)
fonte
APL + WIN, 48 bytes
Solicita uma lista de coordenadas x seguida por uma lista de coordenadas y
Explicação
As distâncias verticais acesas = he as distâncias horizontais acesas são (3) * (1) / (2). O resto é Pitágoras.
fonte
+/.5*⍨(h*2)+×⍨((h←-2-/⌈\m)÷-2-/m←⌽⎕)×⌽-2-/⎕
?⍨
operador então eu não posso dizerRápido , 190 bytes
Experimente online!
Explicação
fonte
Python 2 ,
122120 bytesExperimente online!
fonte
[::-1]
.Python 2 , 89 bytes
Experimente online!
Toma em uma lista de pares de carros alegóricos. Baseado na solução da ovs .
fonte
[::-1]
.APL (Dyalog Unicode) , SBCS de 31 bytes
Usa a fórmula de Graham .
Função de prefixo anônimo, tendo 2 × n matriz de dados como argumento correto. A primeira linha contém valores x da direita para a esquerda e a segunda linha os valores y correspondentes.
Experimente online!
{
…}
Lambda anônima onde⍵
está o argumento:2-/⍵
deltas (lit. pares menos reduções)÷⌿
Δx ⁄ Δy (lit. redução de divisão vertical)×⍨
quadrado (lit. multiplicação selfie)1+
um adicionado a isso(
…)×
Multiplique o seguinte por isso:2⌷⍵
segunda linha do argumento (os valores y)⌈\
executando o máximo (altura mais alta alcançada até agora, indo da direita)2-/
deltas de (lit. pares a menos redução)×⍨
quadrado (lit. multiplicação selfie).5*⍨
raiz quadrada (lit. aumente isso para o poder da metade)+/
somafonte
Gelatina , 23 bytes
Um link diádico com uma lista de valores y à esquerda e uma lista dos respectivos valores x à direita (conforme explicitamente permitido pelo OP nos comentários)
Experimente online!
Quão?
A fração de uma seção (inclinada) acesa é a mesma fração que estaria acesa se fosse uma queda vertical. Observe que, como ocorre o quadrado para avaliar os comprimentos das inclinações, as alturas calculadas ao longo do caminho podem ser negativas (também abaixo, as durações das inclinações acesas são calculadas como negativas divididas por negativas).
Versão monádica de 25 bytes, com uma lista de
[x,y]
coordenadas:Tente este.
fonte
⁸
s e⁹
s.Kotlin , 178 bytes
Experimente online!
A parte de testes muito é não golfed :)
fonte