Historia lub dlaczego to robimy.
Żaden. To ćwiczenie jest całkowicie bezcelowe ... chyba że jesteś Stephen Hawking .
Wyzwanie
Na podstawie listy kątów znajdź średnią tych kątów. Na przykład średnia 91 stopni i -91 stopni wynosi 180 stopni. Aby to zrobić, możesz użyć programu lub funkcji.
Wejście
Lista wartości stopni reprezentujących miary kąta. Możesz założyć, że będą to liczby całkowite. Można je wprowadzić w dowolnym dogodnym formacie lub podać jako argumenty funkcji.
Wynik
Średnia z wprowadzonych wartości. Jeśli dla średniej znaleziono więcej niż jedną wartość, należy podać tylko jedną. Średnia jest definiowana jako wartość, dla której
jest zminimalizowane. Dane wyjściowe muszą zawierać się w przedziale (-180, 180] i być dokładne co najmniej do dwóch miejsc za przecinkiem dziesiętnym.
Przykłady:
> 1 3
2
> 90 -90
0 or 180
> 0 -120 120
0 or -120 or 120
> 0 810
45
> 1 3 3
2.33
> 180 60 -60
180 or 60 or -60
> 0 15 45 460
40
> 91 -91
180
> -89 89
0
Jak zwykle w przypadku codegolf , wygrywa przesyłanie z najmniejszą liczbą bajtów.
Tabela liderów
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
## Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Oto czat na wszelkie pytania dotyczące problemu: http://chat.stackexchange.com/rooms/30175/room-for-average-of-angles
źródło
Odpowiedzi:
Python 3, 129 bajtów
Wydaje się, że ten problem spowodował sporo zamieszania. Intuicyjnie chodzi o wycięcie koła kątów w pewnym punkcie, rozwinięcie koła do linii, obliczenie średniej arytmetycznej na tej linii, a następnie zawinięcie wyniku z powrotem do koła. Ale istnieje wiele różnych punktów, w których można wyciąć koło. Nie wystarczy dowolnie wybrać taki, jak 0 ° lub 180 °. Musisz wypróbować je wszystkie i zobaczyć, który z nich daje najmniejszą sumę kwadratowych odległości. Jeśli twoje rozwiązanie jest znacznie mniej skomplikowane niż to, prawdopodobnie jest złe.
źródło
s**2
nas*s
Python 3, 85 bajtów
Wykorzystuje odpowiedź, która musi być dokładna do dwóch miejsc po przecinku, wypróbowując wszystkie możliwe kąty z przyrostem
1/200
o jeden stopień. To zajmuje mniej niż sekundę na moim komputerze.Ponieważ Python nie pozwala nam wygodnie wypisywać arytmetycznych postępów liczb zmiennoprzecinkowych, reprezentujemy możliwe kąty jako liczbę całkowitą
[0,72000)
, które przekształcają się w kąt(-180,180]
jakox -> 180 - x/200
. Znajdujemy jeden z nich, który daje minimalną sumę kwadratowych różnic kątowych.Dla dwóch kątów z przesunięciem kątowym
d
, kwadratową odległość kątową wyznacza się przez przekształcenie na równoważny kąt w(-180,180]
as180-(d+180)%360
, a następnie kwadrat . Dogodnie kąt podany przezx/200
jest już przesunięty o180
stopnie.źródło
1/200
jest w rzeczywistości problematyczne. W przypadku testowym[1, 3, 3]
to rozwiązanie powraca2.335
i jest zaokrąglane do2.34
poprawnej odpowiedzi2.33
.2.33
są w tym przykładzie. W każdym razie, to zmieniając200
się400
lub2000
(i72000
odpowiednio), aby pracować pomimo zaokrąglenia? Patrząc znów na ten stary problem, myślę, że mogę zobaczyć lepszy sposób.2.333...
a program powraca2.335
, jest poprawny do dwóch miejsc po przecinku bez zaokrąglania. Przepraszam za to.Oktawa,
9795 bajtówPowoduje to utworzenie anonimowej funkcji, która wyszukuje minimum danej funkcji na siatce, która jest wystarczająco dobra. Jako dane wejściowe funkcja przyjmuje wektory kolumnowe, np
[180; 60; -60]
. Do testowania musisz nadać tej funkcji nazwę. Możesz więc np. Uruchomić powyższy kod, a następnie użyćans([180, 60; -60])
.źródło
JavaScript ES6, 87 bajtów
Przykładowe przebiegi (testowane w przeglądarce Firefox):
Praca w toku
Ta wersja ma nieco inne podejście niż przeciętna matematyka. Raczej kąty są konwertowane na wektory, wektory są dodawane, a następnie obliczany jest kąt wynikowego wektora. Niestety, ta wersja jest bardzo niestabilna z trigiem i będę pracował nad wersją modułową.
źródło
f(-91,91)
powinien zwrócić 180.CJam,
4440 bajtówWypróbuj online w interpretatorze CJam .
Przypadki testowe
Pomysł
Obliczamy odchylenie dla wszystkich potencjalnych średnich od -179,99 do 180,00 z krokami wielkości 0,01 i wybieramy to o najniższym odchyleniu.
W tym celu nie ma znaczenia, czy weźmiemy kątowe odległości stopni lub radianów. Zamiast mapować różnice δ kątów od średnich wejściowych i potencjalnych w [0,360 °) i warunkowo odejmując wynik od 180 ° , możemy po prostu obliczyć arccos (cos (πδ ÷ 180 °)) , ponieważ cos jest zarówno okresowe, jak i równe, i arccos zawsze daje wartość w [0, π) .
Kod
źródło
MATLAB, 151
Ok, więc dopóki nie zrozumiem, na czym polega metodologia, właśnie to wymyśliłem. Jest to trochę włamanie, ale ponieważ pytanie mówi, że odpowiedź musi być poprawna do 2.dp, powinna działać.
Zasadniczo sprawdzam każdy kąt między 0 a 360 (w przyrostach co 0,01), a następnie rozwiązuję formułę w pytaniu dla każdego z tych kątów. Następnie kąt z najmniejszą sumą jest wybierany i konwertowany na zakres od -180 do 180.
Kod powinien zawierać oktawę . Możesz spróbować z tłumaczem online
źródło
JavaScript (ES6) 138
Nie mając najmniejszego pojęcia o algorytmie, wypróbowuje wszystkie możliwe wartości z dokładnością do 2 cyfr (-179,99 do 180,00). W każdym razie dość szybko dzięki testom.
Przetestuj poniższy fragment kodu w przeglądarce zgodnej z EcmaScript 6 (implementacja funkcji strzałek i parametrów domyślnych - AFAIK Firefox)
źródło