História, ou por que estamos fazendo isso.
Nenhum. Este exercício é completamente inútil ... a menos que você seja Stephen Hawking .
O desafio
Dada uma lista de ângulos, encontre a média desses ângulos. Por exemplo, a média de 91 graus e -91 graus é de 180 graus. Você pode usar um programa ou função para fazer isso.
Entrada
Uma lista de valores de graus que representam medidas de ângulo. Você pode assumir que eles serão inteiros. Eles podem ser inseridos em qualquer formato conveniente ou fornecidos como argumentos de função.
Resultado
A média dos valores inseridos. Se houver mais de um valor encontrado para a média, apenas um deve ser gerado. A média é definida como o valor pelo qual
é minimizado. A saída deve estar dentro do intervalo de (-180, 180] e ter precisão de pelo menos duas casas atrás do ponto decimal.
Exemplos:
> 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
Como de costume com o codegolf , a submissão com o mínimo de bytes vence.
Entre os melhores
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
## Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
## Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet do placar de líderes:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Aqui está uma sala de bate-papo para qualquer dúvida sobre o problema: http://chat.stackexchange.com/rooms/30175/room-for-average-of-angles
fonte
Respostas:
Python 3, 129 bytes
Esse problema parece ter gerado muita confusão. Intuitivamente, a idéia é cortar o círculo de ângulos em algum momento, desembrulhar o círculo em uma linha, calcular a média aritmética dessa linha e depois embrulhar o resultado de volta ao círculo. Mas há muitos pontos diferentes em que você pode optar por cortar o círculo. Não basta escolher arbitrariamente um, como 0 ° ou 180 °. Você precisa tentar todos eles e ver qual deles resulta na menor soma das distâncias ao quadrado. Se sua solução for significativamente menos complicada que essa, provavelmente ela está errada.
fonte
s**2
paras*s
Python 3, 85 bytes
Aproveita a resposta que precisa ser precisa com duas casas decimais, tentando todos os ângulos possíveis com incrementos de
1/200
grau. Isso leva menos de um segundo na minha máquina.Como o Python não permite listar convenientemente progressões aritméticas de flutuadores, representamos os ângulos possíveis como número inteiro
[0,72000)
, que são convertidos em um ângulo(-180,180]
comox -> 180 - x/200
. Encontramos o que apresenta a soma mínima das diferenças angulares ao quadrado.Para dois ângulos com um deslocamento angular de
d
, a distância angular ao quadrado é encontrada transformando-se em um ângulo equivalente em(-180,180]
como180-(d+180)%360
e depois ao quadrado. Convenientemente, o ângulo dado porx/200
já é deslocado em180
graus.fonte
1/200
é realmente problemático. Para o caso de teste[1, 3, 3]
, essa solução retorna2.335
e é arredondada para2.34
enquanto a resposta correta deve ser2.33
.2.33
estão corretos nesse exemplo. De qualquer forma, a alteração de200
para400
ou para2000
(e72000
correspondentemente) faria com que funcionasse apesar do arredondamento? Além disso, olhando para esse antigo problema novamente, acho que posso ver uma maneira melhor.2.333...
and your program returns2.335
, it is correct until two decimal places without rounding. Sorry for that.Octave,
9795 bytesThis produces an anonymous function that just searches the minimum of the given function on a grid that is just fine enough. As input the function accepts column vectors, e.g.
[180; 60; -60]
. For testing you need to give the function a name. So you could e.g. run the code above and then useans([180, 60; -60])
.fonte
Javascript ES6, 87 bytes
Example runs (Tested in Firefox):
Work in progress
This version takes a slightly different approach than the average-everything-then-do-modular-math. Rather, the angles are converted to vectors, the vectors are added and the angle of the resulting vector is then computed. Unfortunately, this version is very unstable with the trig and I'll be working on a modular-math version.
fonte
f(-91,91)
should return 180.CJam,
4440 bytesTry it online in the CJam interpreter.
Test cases
Idea
We compute the deviation for all potential averages from -179.99 to 180.00 with steps of size 0.01, and select the one with the lowest deviation.
For this purpose, it doesn't matter if we take the angular distances degrees or radians. Rather than mapping the differences δ of angles from input and potential averages in [0,360°) and conditionally subtracting the result from 180°, we can simply calculate arccos(cos(πδ÷180°)), since cos is both periodic and even, and arccos always yields a value in [0,π).
Code
fonte
MATLAB, 151
Ok, so until I can actually understand what the methodology is, this is what I have come up with. It is a little bit of a hack, but as the question states that the answer must be correct to 2.d.p it should work.
I basically check every angle between 0 and 360 (in 0.01 increments) and then solve the formula in the question for each of those angles. Then the angle with the smallest sum is picked and converted into -180 to 180 range.
The code should with Octave. You can try it with the online interpreter
fonte
JavaScript (ES6) 138
Not having the faintest idea of an algorithm, this tries all possibile values with 2 digits precision (-179.99 to 180.00). Quite fast with the test cases anyway.
Test running the snippet below in an EcmaScript 6 compliant browser (implementing arrow functions and default parameters - AFAIK Firefox)
fonte