Histoire, ou pourquoi nous faisons cela.
Aucun. Cet exercice est complètement inutile ... sauf si vous êtes Stephen Hawking .
Le défi
À partir d'une liste d'angles, trouvez la moyenne de ces angles. Par exemple, la moyenne de 91 degrés et -91 degrés est de 180 degrés. Vous pouvez utiliser un programme ou une fonction pour ce faire.
Contribution
Une liste de valeurs de degré représentant des mesures d'angle. Vous pouvez supposer qu'il s'agira d'entiers. Ils peuvent être saisis dans n'importe quel format pratique ou fournis comme arguments de fonction.
Production
La moyenne des valeurs entrées. Si plusieurs valeurs sont trouvées pour la moyenne, une seule doit être sortie. La moyenne est définie comme la valeur pour laquelle
est minimisé. La sortie doit se situer dans la plage (-180, 180] et être précise à au moins deux endroits derrière la virgule décimale.
Exemples:
> 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
Comme d'habitude avec codegolf , la soumission avec le moins d'octets gagne.
Classement
Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.
Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle de démarque suivant:
## Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
## Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Voici un salon de discussion pour toute question sur le problème: http://chat.stackexchange.com/rooms/30175/room-for-average-of-angles
la source
Réponses:
Python 3, 129 octets
Ce problème semble avoir généré pas mal de confusion. Intuitivement, l'idée est de couper le cercle d'angles à un moment donné, de dérouler le cercle en une ligne, de calculer la moyenne arithmétique sur cette ligne, puis de replacer le résultat dans le cercle. Mais il existe de nombreux points différents où vous pouvez choisir de couper le cercle. Il ne suffit pas d'en choisir arbitrairement, par exemple 0 ° ou 180 °. Vous devez tous les essayer et voir lequel donne la plus petite somme des distances au carré. Si votre solution est beaucoup moins compliquée que cela, c'est probablement faux.
la source
s**2
pours*s
Python 3, 85 octets
Profite de la réponse qui n'a besoin d'être précise qu'à deux décimales près en essayant tous les angles possibles avec des incréments
1/200
d'un degré. Cela prend moins d'une seconde sur ma machine.Parce que Python ne nous permet pas de lister commodément les progressions arithmétiques des flottants, nous représentons les angles possibles en nombre entier
[0,72000)
, qui se convertissent en un angle en tant(-180,180]
quex -> 180 - x/200
. Nous trouvons celui qui donne la somme minimale des différences angulaires au carré.Pour deux angles avec un déplacement angulaire de
d
, la distance angulaire au carré est trouvée en se transformant en un angle équivalent en(-180,180]
as180-(d+180)%360
, puis au carré. De manière pratique, l'angle donné parx/200
est déjà décalé de180
degrés.la source
1/200
est en fait problématique. Pour le cas de test[1, 3, 3]
, cette solution retourne2.335
et est arrondie à2.34
alors que la bonne réponse devrait être2.33
.2.33
soient exacts dans cet exemple. Dans tous les cas, est-ce que changer le200
to400
ou le to2000
(et en72000
conséquence) le ferait fonctionner malgré l'arrondissement? Aussi, en regardant à nouveau ce vieux problème, je pense que je pourrais voir une meilleure façon.2.333...
et que votre programme revient2.335
, elle est correcte jusqu'à deux décimales sans arrondir. Désolé.Octave,
9795 octetsCela produit une fonction anonyme qui recherche juste le minimum de la fonction donnée sur une grille qui est juste assez fine. En entrée, la fonction accepte les vecteurs de colonne, par exemple
[180; 60; -60]
. Pour les tests, vous devez donner un nom à la fonction. Vous pouvez donc par exemple exécuter le code ci-dessus, puis l'utiliserans([180, 60; -60])
.la source
Javascript ES6, 87 octets
Exemple d'exécutions (testé dans Firefox):
Travail en cours
Cette version adopte une approche légèrement différente de la moyenne-tout-puis-faire-modulaire-math. Au contraire, les angles sont convertis en vecteurs, les vecteurs sont ajoutés et l'angle du vecteur résultant est ensuite calculé. Malheureusement, cette version est très instable avec le trig et je vais travailler sur une version mathématique modulaire.
la source
f(-91,91)
devrait retourner 180.CJam,
4440 octetsEssayez-le en ligne dans l' interpréteur CJam .
Cas de test
Idée
Nous calculons l'écart pour toutes les moyennes potentielles de -179,99 à 180,00 avec des pas de taille 0,01 , et sélectionnons celui avec l'écart le plus faible.
À cette fin, peu importe si nous prenons les degrés angulaires ou les radians. Plutôt que de cartographier les différences δ des angles des moyennes d'entrée et de potentiel dans [0,360 °) et de soustraire conditionnellement le résultat de 180 ° , nous pouvons simplement calculer les arccos (cos (πδ ÷ 180 °)) , car cos est à la fois périodique et pair, et arccos donne toujours une valeur dans [0, π) .
Code
la source
MATLAB, 151
Ok, donc jusqu'à ce que je puisse réellement comprendre la méthodologie, c'est ce que j'ai trouvé. C'est un peu un hack, mais comme la question indique que la réponse doit être correcte à 2.dp, cela devrait fonctionner.
Je vérifie essentiellement tous les angles entre 0 et 360 (par incréments de 0,01), puis je résous la formule de la question pour chacun de ces angles. Ensuite, l'angle avec la plus petite somme est choisi et converti en plage de -180 à 180.
Le code devrait avec Octave . Vous pouvez l'essayer avec l' interprète en ligne
la source
JavaScript (ES6) 138
N'ayant pas la moindre idée d'un algorithme, cela essaie toutes les valeurs possibles avec une précision de 2 chiffres (-179,99 à 180,00). De toute façon assez rapide avec les cas de test.
Testez l'exécution de l'extrait ci-dessous dans un navigateur compatible EcmaScript 6 (implémentation des fonctions fléchées et des paramètres par défaut - AFAIK Firefox)
la source