15
1
Story, or why we are doing this.
None. This exercise is completely pointless ... unless you are Stephen Hawking.
The Challenge
Given a list of angles, find the average of those angles. For example the average of 91 degrees and -91 degrees is 180 degrees. You can use a program or function to do this.
Input
A list of degree values representing angle measures. You may assume that they will be integers. They can be inputted in any convenient format or provided as function arguments.
Output
The average of the inputted values. If there are more than one value found for the average, only one should be outputted. The average is defined as the value for which
is minimized. The output must be within the range of (-180, 180] and be accurate to at least two places behind the decimal point.
Examples:
> 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
As usual with codegolf, the submission with the least bytes wins.
Leaderboard
Here is a Stack Snippet to generate both a regular leaderboard and an overview of winners by language.
var QUESTION_ID=60538,OVERRIDE_USER=32700;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
To make sure that your answer shows up, please start your answer with a headline, using the following Markdown template:
## Language Name, N bytes
where N
is the size of your submission. If you improve your score, you can keep old scores in the headline, by striking them through. For instance:
## Ruby, <s>104</s> <s>101</s> 96 bytes
If there you want to include multiple numbers in your header (e.g. because your score is the sum of two files or you want to list interpreter flag penalties separately), make sure that the actual score is the last number in the header:
## Perl, 43 + 2 (-p flag) = 45 bytes
You can also make the language name a link which will then show up in the leaderboard snippet:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Here is a chatroom for any questions about the problem: http://chat.stackexchange.com/rooms/30175/room-for-average-of-angles
Shouldn't 90,-90 give 180 if 91,-91 gives 180? – Blue – 2015-10-12T20:58:40.290
2Intuitively the average of -91 and 91 is 0, not 180. Using your definition we have: (180-91)^2+(180- -91)^2 => 81362, while (0-91)^2+(0- -91)^2 => 16562. So 180 surely can not be the average. What am I missing here? – edc65 – 2015-10-12T20:59:58.417
91%360=91;-91%360=269;(269+91)/2=180. Never mind, misread. Maybe? I'm not sure now. – Blue – 2015-10-12T21:01:31.667
Ok thanks. Still no idea about how finding it – edc65 – 2015-10-12T21:52:48.760
So the set
270, -90
should be -90, yes? – Addison Crump – 2015-10-12T22:07:30.050And my answer also gets 0 for -91 and 91. I'll do some more work on it. – Addison Crump – 2015-10-12T22:10:34.757
So, by what I see here, do you assume that 360 and 0 average to 180? O.o – Addison Crump – 2015-10-12T22:16:02.870
Okay. I think I get it now, the angular distance kinda threw me off. I have an answer now. I hope. – Addison Crump – 2015-10-12T22:17:59.237
Tested and verified - It gets it. :) – Addison Crump – 2015-10-12T22:21:46.710
sanity check me: can this be solved by simply adding together unit vectors of the given angles, and printing the angle of the sum? – Sparr – 2015-10-12T23:13:50.987
I think your snippet is from another challenge. – cole – 2015-10-13T02:30:15.413
3None of your test cases so far break the incorrect algorithm of simply taking all the angles mod 360°, taking their average, and then subtracting 360° if the result is greater than 180°. You should add a case like [89°, −89°], which should return 0°. – Anders Kaseorg – 2015-10-13T04:25:12.360
Note for solvers. I believe that, instead of trying to cut the circle at every possible point, it should be sufficient to do so at each of the given points (but without, of course, omitting that point from your calculations!). This is because the average of all the points when the circle is cut at any point beteeen input1 and input2 (where the inputs are numbered in cyclic order) is I think the same as the average when the circle is cut at input2 (including input2). – msh210 – 2018-05-13T16:25:38.147