История или почему мы это делаем.
Никто. Это упражнение совершенно бессмысленно ... если только вы не Стивен Хокинг .
Соревнование
Учитывая список углов, найдите среднее из этих углов. Например, среднее значение 91 градуса и -91 градуса составляет 180 градусов. Вы можете использовать программу или функцию, чтобы сделать это.
вход
Список значений градусов, представляющих угловые измерения. Вы можете предположить, что они будут целыми числами. Они могут быть введены в любом удобном формате или предоставлены в качестве аргументов функции.
Выход
Среднее из введенных значений. Если для среднего найдено более одного значения, должно быть выведено только одно. Среднее значение определяется как значение, для которого
сводится к минимуму Выходные данные должны находиться в диапазоне (-180, 180] и быть точными как минимум в двух местах после десятичной точки.
Примеры:
> 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
Как обычно с codegolf , выигрывает представление с наименьшим количеством байтов.
Leaderboard
Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
## Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш счет равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
## Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать название языка ссылкой, которая затем будет отображаться в фрагменте списка лидеров:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Вот чат для любых вопросов о проблеме: http://chat.stackexchange.com/rooms/30175/room-for-average-of-angles
источник
Ответы:
Python 3, 129 байт
Эта проблема, кажется, породила много путаницы. Интуитивно понятно, что идея состоит в том, чтобы обрезать круг углов в некоторой точке, развернуть круг в линию, вычислить среднее арифметическое на этой линии, а затем перенести результат обратно в круг. Но есть много разных точек, где вы можете вырезать круг. Недостаточно произвольно выбрать один, например, 0 ° или 180 °. Вы должны попробовать их все и посмотреть, какой из них приведет к наименьшей сумме квадратов расстояний. Если ваше решение значительно менее сложное, чем это, это, вероятно, неправильно.
источник
s**2
наs*s
Python 3, 85 байт
Воспользуйтесь преимуществом ответа, необходимого только для точности с точностью до двух десятичных знаков, пробуя все возможные углы с шагом
1/200
в градус. Это занимает меньше секунды на моей машине.Поскольку Python не позволяет нам удобно перечислять арифметические последовательности чисел с плавающей точкой, мы представляем возможные углы как целое число
[0,72000)
, которые преобразуются в угол(-180,180]
какx -> 180 - x/200
. Мы находим один из них, который дает минимальную сумму квадратов угловых разностей.Для двух углов с угловым смещением
d
квадрат углового расстояния определяется путем преобразования в эквивалентный угол в(-180,180]
as180-(d+180)%360
, затем в квадрат. Удобно, когда угол, заданный посредствомx/200
, уже смещен на180
градусы.источник
1/200
самом деле проблематично. Для тестового примера[1, 3, 3]
это решение возвращается2.335
и округляется до2.34
правильного ответа2.33
.2.33
в этом примере верны . В любом случае, будет изменяя200
к400
или2000
(и72000
соответственно) заставить его работать , несмотря на округление? Кроме того, глядя на эту старую проблему еще раз, я думаю, что я мог бы найти лучший путь.2.333...
и ваша программа возвращается2.335
, он верен до двух десятичных знаков без округления. Простите за это.Октава,
9795 байтЭто создает анонимную функцию, которая просто ищет минимум данной функции в сетке, что достаточно хорошо. В качестве входных данных функция принимает векторы столбцов, например
[180; 60; -60]
. Для тестирования необходимо дать имя функции. Так что вы можете, например, запустить приведенный выше код, а затем использоватьans([180, 60; -60])
.источник
Javascript ES6, 87 байт
Пример запуска (протестировано в Firefox):
Работа в процессе
Эта версия использует немного другой подход, чем математика "все, что потом делает". Скорее углы преобразуются в векторы, векторы добавляются, а затем вычисляется угол результирующего вектора. К сожалению, эта версия очень нестабильна с триггером, и я буду работать над модульно-математической версией.
источник
f(-91,91)
должен вернуть 180.CJam,
4440 байтПопробуйте онлайн в интерпретаторе CJam .
Контрольные примеры
идея
Мы вычисляем отклонение для всех потенциальных средних от -179,99 до 180,00 с шагом 0,01 и выбираем значение с наименьшим отклонением.
Для этого не имеет значения, будем ли мы брать угловые расстояния в градусах или радианах. Вместо того, чтобы отображать различия δ углов от входных и потенциальных средних в [0,360 °) и условно вычитать результат из 180 ° , мы можем просто вычислить arccos (cos (πδ ÷ 180 °)) , поскольку cos является как периодическим, так и четным, и arccos всегда дает значение в [0, π) .
Код
источник
МАТЛАБ, 151
Итак, пока я не смогу понять, что такое методология, это то, что я придумал. Это немного взломать, но поскольку вопрос гласит, что ответ должен быть правильным для 2.dp, он должен работать.
Я в основном проверяю каждый угол от 0 до 360 (с шагом 0,01), а затем решаю формулу в вопросе для каждого из этих углов. Затем выбирается угол с наименьшей суммой и преобразуется в диапазон от -180 до 180.
Код должен с октавой . Вы можете попробовать это с онлайн переводчиком
источник
JavaScript (ES6) 138
Не имея ни малейшего представления об алгоритме, он пробует все возможные значения с точностью до 2 цифр (от -179,99 до 180,00). В любом случае, довольно быстро с тестовыми примерами.
Тестовый запуск фрагмента ниже в браузере, совместимом с EcmaScript 6 (реализация функций стрелок и параметров по умолчанию - AFAIK Firefox)
источник