Powiązane z tym pytaniem .
Pokój jest zdefiniowany jako (niekoniecznie wypukłą) nie przecinają się wielokąt, wyrażone w uporządkowanym wykazie współrzędnych 2-wymiarowych. Wystarczająco jasna żarówka jest umieszczona w określonym punkcie w pomieszczeniu i emituje światło we wszystkich kierunkach. Twoim zadaniem jest znalezienie całkowitej oświetlonej powierzchni pomieszczenia. Możesz przyjmować dane wejściowe w dowolnym rozsądnym formacie. Punkty na wielokącie / pomieszczeniu, a także współrzędne źródła światła są liczbami wymiernymi. Można je pobierać zgodnie z ruchem wskazówek zegara lub przeciwnie do ruchu wskazówek zegara, każdy format jest w porządku. Przypadek testowy dla problemu podano w kierunku przeciwnym do ruchu wskazówek zegara.
Poniższy obrazek pokazuje dwa przykładowe pokoje, w których fioletowa kropka reprezentuje źródło światła, a zacieniony obszar reprezentuje oświetlony obszar.
Przypadek testowy:
(1/2, 18)
(1,3)
(5,1/2)
(7,5)
(12,7)
(16,3)
(15,11)
(8,19)
(3,7)
Light source located at (5,8)
Answer: 815523/6710 ≈ 121.538
Oto graficzne przedstawienie rozwiązania tego przypadku testowego. Dwa punkty, które definiują rozwiązanie, które nie znajdują się na pierwotnym wielokącie, to (55/61, 363/61) i (856/55, 357/55).
Ta formuła może być pomocna w obliczaniu powierzchni.
Ponieważ jest to code-golf , wygrywa najkrótszy kod w bajtach.
[tag:code-golf]
Odpowiedzi:
Python 3 , 388
398408409415417493bajtówAby zwiększyć dokładność, zwiększ
n
Podstawowe podejście Monte-Carlo. Kroki wymienione poniżej.
s
s
przez całkowitą liczbę, a następnie pomnóż przez całkowity obszar zasięgu.Wersja bez golfa:
Wypróbuj online!
Kredyt za algorytm przecięcia linii
Również podziękowania dla wszystkich pomocnych komentatorów, jak pograć w golfa jeszcze bardziej.
źródło
from random import*
(podział linii)u=uniform
dla -2 bajtówg=lambda i:
n
musi to być moc 10? W przeciwnym razie możesz uratować bajt, używając mocy 9.i:(min
, spację wx[i]for
można również usunąć. Ponadto,return float(s/n)*(r*t)
może byćreturn(r*t)*float(s/n)
. Nie jestem do końca pewien, ale czy nie można usunąć zmiennychr
ie
użyć ich bezpośrednio, ponieważ używasz ich tylko raz? W jakiś sposób daje nieco inny wynik, mimo żeg
nie jest modyfikowany, więc ta część trochę mnie dezorientuje (nie jestem zbyt zaznajomiony z Pythonem, aby zrozumieć, dlaczego wynik jest nieco inny).Haskell , 559
618632bajtówDokładne rozwiązanie (z wyjątkiem błędów). Haskell ma wbudowaną dokładną racjonalną arytmetykę. Wypróbuj online!
Zauważ, że daje to
815523/6710
nie814643/6710
przykładowe pomieszczenie, a pierwsze przecięcie ściany jest obliczane jako(55/61, 363/61)
. Jestem całkiem pewien, że jest to poprawne, ponieważ wpis w Monte Carlo (powoli) zbiega się do tego samego wyniku.Legenda:
Bonus: Połysk GUI do testowania. Kliknij obok punktów, aby je przenieść.
źródło
APL + WIN
To jest nieogolona wersja tego interesującego wyzwania, które proponuję, aby zademonstrować moją logikę. Moja starożytna wersja APL + WIN nie jest odpowiednia dla zagnieżdżonych struktur kontrolnych. Bardziej nowoczesne APL mogłyby równie dobrze zrobić wyzwanie - wyzwanie?
Jeśli czytelnicy potwierdzą logikę, spróbuję zagrać w golfa w tym rozwiązaniu. Jeśli logika jest nieprawidłowa, po prostu usunę.
źródło
R ,
296255 bajtówWypróbuj online!
To jest kolejna zmniejszona wersja odpowiedzi na Python . Podstawowa metoda Monte Carlo jest taka sama, ale zmieniłem niektóre funkcje, aby były krótsze. W pierwszej iteracji byłem zbyt agresywny w przestawianiu, a potem zdałem sobie sprawę, że mogę zoptymalizować zarówno długość, jak i prędkość, wracając do wersji algorytmu skrzyżowania bliżej pytona.
Oto wersja bez golfa, która również drukuje wyniki:
źródło