Góra jest zdefiniowana jako zbiór odcinków, których pierwszy punkt ma współrzędne (0,a)
miarę a > 0
, i którego ostatni punkt ma współrzędne (b,0)
, gdzie b > 0
. Wszystkie punkty pośrednie mają współrzędną y (rzędną) ściśle większą niż 0. Dostajesz punkty na górze posortowane w porządku rosnącym współrzędnych x (odcięta). Zauważ, że dwa punkty mogą mieć tę samą współrzędną x, tworząc pionowy odcinek góry. Jeśli otrzymasz dwa punkty o tej samej współrzędnej x, należy je połączyć w podanej kolejności. Ponadto mogą istnieć poziome segmenty góry. Te poziome segmenty nie są oświetlone, bez względu na wszystko. Wszystkie współrzędne są liczbami całkowitymi nieujemnymi.
Pytanie: jaka jest całkowita długość góry, która byłaby oświetlona, zakładając, że słońce jest nieskończoną pionową płaszczyzną światła usytuowaną na prawo od góry? Liczby tej nie trzeba zaokrąglać, ale jeśli jest zaokrąglona, należy podać co najmniej cztery miejsca po przecinku. Zawarłem zdjęcie: pogrubione linie reprezentują podświetlone segmenty. Zauważ, że na wejściu P pojawia się przed Q (PQ jest pionowym odcinkiem linii), więc poprzedni punkt jest podłączony do P, a nie do Q.
Możesz przyjmować dane wejściowe w dowolnym rozsądnym formacie, takim jak lista list, pojedyncza lista, ciąg znaków itp.
Przypadek testowy:
(0,3000)
(500, 3500)
(2500, 1000)
(5000,5000)
(9000,2000)
(9000,3500)
(10200,0)
Output: 6200.0000
Są tutaj dwa podświetlone segmenty, jak pokazano na tym obrazku: Pierwszy ma długość 5000/2 = 2500, a drugi ma długość 3700.
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
(x1, y1)
i(x2,y2)
. Punktem, który „blokuje” jest(x3, y3)
. Załóżmy, że y2 <y3 <= y1. Zatem długość segmentu to((y1 - y3)/(y1 - y2))*sqrt((x1 - x2)^2 + (y1 - y2)^2)
. Jest to zasadniczo wzór na odległość pomnożony przez ułamek faktycznie używanego segmentuOdpowiedzi:
Python 2 ,
134 131 128 124 120 117 109107 bajtówWypróbuj online!
Pobiera dane wejściowe jako listę krotek / dwuelementowych list liczb zmiennoprzecinkowych.
Wyjaśnienie
Zasadniczo iterujemy przez pary punktów na wykresie, a jeśli , obliczamy, ile linii jest wystawiane na działanie światła. Iteracja par wykonywana jest za pomocą pętli, aby uzyskać następny punkt , za każdym razem pierwszy element na liście, aby pobrać bieżący punkt .y1> y2) ( x2), y2)) ( x1, y1)
for
Matematyka - Jaka część segmentu linii jest wystawiona na światło?
Niech będą współrzędnymi bieżącego punktu. Niech maksymalną wysokością punktu za bieżącym (lokalne maksima za bieżącym punktem), a będą współrzędnymi następnego punktu. Aby obliczyć długość wystawioną na słońce, , powinniśmy znaleźć , jak pokazano na schemacie. Oczywiście, jeśli , segment w ogóle nie będzie wystawiony na działanie światła.( x1, y1) ym a x ( x2), y2)) L. x3) y1≤ ym a x
W utworzonym trójkącie odcinek linii o długości jest równoległy do podstawy o długości , więc wszystkie trzy kąty są zgodne. Dlatego z Podstawowego twierdzenia podobieństwa (przypadek Kąt-kąt) możemy wywnioskować, że . Dlatego . Następnie możemy zastosować twierdzenie Pitagorasa, aby stwierdzić, że:x3) x2)- x1 x3)x2)- x1= y1- ym a xy1 x3)= ( y1- ym a x) ( x2)- x1)y1
Łącząc te dwie formuły, dochodzimy do następującego wyrażenia, które jest rdzeniem tego podejścia:
L=√
Kod - jak to działa?
Dziennik zmian
Stopniowo zoptymalizowano formułę do gry w golfa.
Oszczędność 1 bajtu dzięki FlipTack .
Zaoszczędzono 2 bajty, usuwając niepotrzebny warunek
y>Y
, ponieważ ponieważ lokalne maksima współrzędnej Y po odjęciu bieżącego punktuy
są dodatnie, warunek ten jest zbędny. To niestety unieważnia grę w golfa FlipTack.Zaoszczędziliśmy 3 bajty, zmieniając nieco algorytm: zamiast zmiennej licznika, zwiększając ją i dostosowując listę, usuwamy pierwszy element przy każdej iteracji.
Zaoszczędzono 8 bajtów dzięki ovs ; zmiana
(x,y),(X,Y)
stanu pętli za pomocąlist.pop()
techniki.Zaoszczędził 2 bajty dzięki Ørjan Johansen (nieco zoptymalizował formułę).
źródło
JavaScript, 97 bajtów
(Można zapisać 5 bajtów, jeśli przyjęcie odwróconej wersji danych wejściowych zostanie uznane za prawidłowe.)
źródło
APL + WIN, 48 bajtów
Monituje o listę współrzędnych x, a następnie listę współrzędnych y
Wyjaśnienie
Świecone odległości pionowe = h, a oświetlone odległości poziome wynoszą (3) * (1) / (2). Reszta to Pitagoras.
źródło
+/.5*⍨(h*2)+×⍨((h←-2-/⌈\m)÷-2-/m←⌽⎕)×⌽-2-/⎕
zadziała?⍨
operatora, więc nie mogę powiedziećSzybki , 190 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Python 2 ,
122120 bajtówWypróbuj online!
źródło
[::-1]
.Python 2 , 89 bajtów
Wypróbuj online!
Zawiera listę par pływaków. Na podstawie rozwiązania ovs .
źródło
[::-1]
.APL (Dyalog Unicode) , 31 bajtów SBCS
Wykorzystuje formułę Grahama .
Anonimowa funkcja prefiksu przyjmująca macierz danych 2 × n jako właściwy argument. Pierwszy wiersz zawiera wartości x od prawej do lewej, a drugi wiersz odpowiada odpowiednim wartościom y.
Wypróbuj online!
{
…}
Anonimowa lambda gdzie⍵
jest argument:2-/⍵
delty (litowo minusowe redukcje)÷⌿
Δx ⁄ Δy ( podświetlone zmniejszenie podziału pionowego)×⍨
kwadrat (oświetlone selfie z mnożeniem)1+
jeden do tego dodany(
…)×
Pomnóż przez to:2⌷⍵
drugi wiersz argumentu (wartości y)⌈\
bieganie maksimum (najwyższa osiągnięta do tej pory, idąc od prawej)2-/
delty (litera minus minus redukcja)×⍨
kwadrat (oświetlone selfie z mnożeniem).5*⍨
pierwiastek kwadratowy (dosł. zwiększ to do potęgi połowy)+/
sumaźródło
Galaretka , 23 bajty
Dyadyczny link pobierający listę wartości y po lewej stronie i listę odpowiednich wartości x po prawej stronie (co wyraźnie dozwolone przez OP w komentarzach)
Wypróbuj online!
W jaki sposób?
Frakcja oświetlonego odcinka (pochyłego) jest tą samą frakcją, która byłaby oświetlona, gdyby był to pionowy spadek. Zauważ, że ponieważ do oceny długości nachylenia dochodzi do kwadratu, obliczone wysokości po drodze mogą być ujemne (również poniżej długości przebiegów oświetlonych stoków są obliczane jako ujemne podzielone przez ujemne).
25-bajtowa wersja monadyczna z listą
[x,y]
współrzędnych:Spróbuj tego.
źródło
⁸
s i⁹
s.Kotlin , 178 bajtów
Wypróbuj online!
Część testowa jest bardzo nie golfa :)
źródło