Historia, o por qué estamos haciendo esto.
Ninguna. Este ejercicio no tiene sentido ... a menos que seas Stephen Hawking .
El reto
Dada una lista de ángulos, encuentre el promedio de esos ángulos. Por ejemplo, el promedio de 91 grados y -91 grados es 180 grados. Puede usar un programa o función para hacer esto.
Entrada
Una lista de valores de grados que representan medidas de ángulos. Puede suponer que serán enteros. Se pueden ingresar en cualquier formato conveniente o proporcionarse como argumentos de función.
Salida
El promedio de los valores ingresados. Si se encuentra más de un valor para el promedio, solo se debe generar uno. El promedio se define como el valor para el cual
se minimiza La salida debe estar dentro del rango de (-180, 180] y tener una precisión de al menos dos lugares detrás del punto decimal.
Ejemplos:
> 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 es habitual con codegolf , gana el envío con la menor cantidad de bytes.
Tabla de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Aquí hay una sala de chat para cualquier pregunta sobre el problema: http://chat.stackexchange.com/rooms/30175/room-for-average-of-angles
fuente
Respuestas:
Python 3, 129 bytes
Este problema parece haber generado bastante confusión. Intuitivamente, la idea es cortar el círculo de ángulos en algún punto, desenvolver el círculo en una línea, calcular la media aritmética en esa línea y luego envolver el resultado nuevamente en el círculo. Pero hay muchos puntos diferentes donde puedes elegir cortar el círculo. No es suficiente elegir arbitrariamente uno, como 0 ° o 180 °. Debe probarlos todos y ver cuál resulta en la suma más pequeña de distancias al cuadrado. Si su solución es significativamente menos complicada que esto, probablemente sea incorrecta.
fuente
s**2
as*s
Python 3, 85 bytes
Aprovecha la respuesta que solo necesita ser precisa con dos decimales al intentar todos los ángulos posibles con incrementos
1/200
de un grado. Esto toma menos de un segundo en mi máquina.Debido a que Python no nos permite enumerar convenientemente progresiones aritméticas de flotadores, representamos los posibles ángulos como un número entero
[0,72000)
, que se convierten en un ángulo(-180,180]
comox -> 180 - x/200
. Encontramos uno de estos que da la suma mínima de las diferencias angulares al cuadrado.Para dos ángulos con un desplazamiento angular de
d
, la distancia angular al cuadrado se encuentra mediante la transformación a un ángulo equivalente en(-180,180]
as180-(d+180)%360
, luego cuadrando. Convenientemente, el ángulo dado porx/200
ya está compensado por180
grados.fuente
1/200
es realmente problemático. Para el caso de prueba[1, 3, 3]
, esta solución regresa2.335
y se redondea a2.34
la respuesta correcta2.33
.2.33
son correctos en ese ejemplo. En cualquier caso, ¿cambiar el200
to to400
to2000
(y en72000
consecuencia) lo haría funcionar a pesar del redondeo? Además, al mirar este viejo problema nuevamente, creo que podría ver una mejor manera.2.333...
y su programa regresa2.335
, es correcto hasta dos decimales sin redondear. Lo siento por eso.Octava,
9795 bytesEsto produce una función anónima que solo busca el mínimo de la función dada en una cuadrícula que es lo suficientemente buena. Como entrada, la función acepta vectores de columna, por ejemplo
[180; 60; -60]
. Para realizar la prueba, debe asignar un nombre a la función. Entonces, por ejemplo, puede ejecutar el código anterior y luego usarloans([180, 60; -60])
.fuente
Javascript ES6, 87 bytes
Ejecuciones de ejemplo (probado en Firefox):
Trabajo en progreso
Esta versión adopta un enfoque ligeramente diferente al promedio-todo-entonces-hacer-matemática modular. Por el contrario, los ángulos se convierten en vectores, los vectores se agregan y luego se calcula el ángulo del vector resultante. Desafortunadamente, esta versión es muy inestable con el trigonometría y estaré trabajando en una versión matemática modular.
fuente
f(-91,91)
debería devolver 180.CJam,
4440 bytesPruébelo en línea en el intérprete de CJam .
Casos de prueba
Idea
Calculamos la desviación para todos los promedios potenciales de -179.99 a 180.00 con pasos de tamaño 0.01 , y seleccionamos el que tiene la desviación más baja.
Para este propósito, no importa si tomamos las distancias angulares grados o radianes. En lugar de mapear las diferencias δ de ángulos de los promedios de entrada y potencial en [0,360 °) y restar condicionalmente el resultado de 180 ° , simplemente podemos calcular arccos (cos (πδ ÷ 180 °)) , ya que cos es tanto periódico como par, y arccos siempre produce un valor en [0, π) .
Código
fuente
MATLAB, 151
Ok, hasta que pueda entender cuál es la metodología, esto es lo que se me ocurrió. Es un truco, pero como dice la pregunta que la respuesta debe ser correcta a 2.dp, debería funcionar.
Básicamente verifico cada ángulo entre 0 y 360 (en incrementos de 0.01) y luego resuelvo la fórmula en la pregunta para cada uno de esos ángulos. Luego, el ángulo con la suma más pequeña se elige y se convierte en un rango de -180 a 180.
El código debería con Octave . Puedes probarlo con el intérprete en línea.
fuente
JavaScript (ES6) 138
Al no tener la menor idea de un algoritmo, intenta todos los valores posibles con una precisión de 2 dígitos (-179,99 a 180,00). Muy rápido con los casos de prueba de todos modos.
Pruebe a ejecutar el fragmento a continuación en un navegador compatible con EcmaScript 6 (implementando funciones de flecha y parámetros predeterminados - AFAIK Firefox)
fuente