Skip to main content
We’ve updated our Terms of Service. A new AI Addendum clarifies how Stack Overflow utilizes AI interactions.
Code Golf

You are not logged in. Your edit will be placed in a queue until it is peer reviewed.

We welcome edits that make the post easier to understand and more valuable for readers. Because community members review edits, please try to make the post substantially better than how you found it, for example, by fixing grammar or adding additional resources and hyperlinks.

Required fields*

Required fields*

AGM Series Hole 1: Calculate the Arithmetic–Geometric Mean

This question was inspired by this HNQ.

About the series

This question is now part of a series about the AGM method. This first post in the series will be about actually calculating the AGM. You may treat this like any other code golf challenge, and answer it without worrying about the series at all. However, there is a leaderboard across all challenges.

What is the Arithmetic–Geometric Mean

The Arithmetic–Geometric Mean of two numbers is defined as the number that repeatedly taking the arithmetic and geometric means converges to. Your task is to find this number after some n iterations.

Clarifications

  • You take three numbers, a, b, n in any reasonable format.
  • For n iterations, take the arithmetic and geometric mean of a and b and set those to a and b.
  • For two numbers a and b, the arithmetic mean is defined as (a + b) / 2.
  • The geometric mean is defined as √(a * b).
  • a and b should be approaching each other.
  • Then, output both a and b.
  • You don't have to worry about float imprecision and such.
  • This is so shortest code in bytes wins!

Test Cases

[0, [24, 6]] -> [24, 6] 
[1, [24, 6]] -> [15.0, 12.0]
[2, [24, 6]] -> [13.5, 13.416407864998739]
[5, [24, 6]] -> [13.458171481725616, 13.458171481725616]
[10, [100, 50]] -> [72.83955155234534, 72.83955155234534]
The next one is 1/Gauss's Constant:
[10, [1, 1.41421356237]] -> [1.198140234734168, 1.1981402347341683]

Leaderboard

Stolen from Martin's series.

The following snippet will generate a leaderboard across all challenges of the series.

To make sure that your answers show up, please start every 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

/* Configuration */
var QUESTION_IDs = [66068]; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!.FjwQBrX2KXuFkv6p2lChi_RjzM19";
/* App */
var answers = [], page = 1, currentQ = -1;
function answersUrl(index) {
 return "http://api.stackexchange.com/2.2/questions/" + QUESTION_IDs.join(";") + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function getAnswers() {
 $.ajax({
 url: answersUrl(page++),
 method: "get",
 dataType: "jsonp",
 crossDomain: true,
 success: function (data) {
 answers.push.apply(answers, data.items);
 if (data.has_more) getAnswers();
 else process();
 }
 });
}
getAnswers();
var SIZE_REG = /\d+(?=[^\d&]*(?:&lt;(?:s&gt;((?!&gt;).)*&lt;\/s&gt;|((?!&gt;).)+&gt;)[^\d&]*)*$)/;
var NUMBER_REG = /\d+/;
var LANGUAGE_REG = /^#*\s*([^\n,]+)(?=,)/;//
function shouldHaveHeading(a) {
 var pass = false;
 var lines = a.body_markdown.split("\n");
 try {
 pass |= /^#/.test(a.body_markdown);
 pass |= ["-", "="]
 .indexOf(lines[1][0]) > -1;
 pass &= LANGUAGE_REG.test(a.body_markdown);
 } catch (ex) {}
 return pass;
}
function shouldHaveScore(a) {
 var pass = false;
 try {
 pass |= SIZE_REG.test(a.body_markdown.split("\n")[0]);
 } catch (ex) {}
 if (!pass) console.log(a);
 return pass;
}
function getAuthorName(a) {
 return a.owner.display_name;
}
function getAuthorId(a) {
 return a.owner.user_id;
}
function process() {
 answers = answers.filter(shouldHaveScore)
 .filter(shouldHaveHeading);
 answers.sort(function (a, b) {
 var aB = +(a.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0],
 bB = +(b.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0];
 return aB - bB
 });
 var users = {};
 answers.forEach(function (a) {
 var headline = a.body_markdown.split("\n")[0];
 var question = QUESTION_IDs.indexOf(a.question_id);
 var size = parseInt((headline.match(SIZE_REG)||[0])[0]);
 var language = headline.match(LANGUAGE_REG)[1];
 var user = getAuthorName(a);
 var userId = getAuthorId(a);
 if (!users[userId]) users[userId] = {name: user, nAnswer: 0, answers: []};
 if (!users[userId].answers[question]) {
 users[userId].answers[question] = {size: Infinity};
 users[userId].nAnswer++;
 }
 if (users[userId].answers[question].size > size) {
 users[userId].answers[question] = {size: size, link: a.share_link}
 }
 });
 
 
 var sortedUsers = [];
 for (var userId in users)
 if (users.hasOwnProperty(userId)) {
 var user = users[userId];
 user.score = 0;
 user.completedAll = true;
 for (var i = 0; i < QUESTION_IDs.length; ++i) {
 if (user.answers[i])
 user.score += user.answers[i].size;
 else
 user.completedAll = false;
 }
 sortedUsers.push(user);
 } 
 
 sortedUsers.sort(function (a, b) {
 if (a.nAnswer > b.nAnswer) return -1;
 if (b.nAnswer > a.nAnswer) return 1;
 return a.score - b.score;
 });
 
 var place = 1;
 for (var i = 0; i < sortedUsers.length; ++i) {
 var user = sortedUsers[i];
 var row = '<tr><td>'+ place++ +'.</td><td>'+user.name+'</td>';
 for (var j = 0; j < QUESTION_IDs.length; ++j) {
 var answer = user.answers[j];
 if (answer)
 row += '<td><a href="'+answer.link+'">'+answer.size+'</a></td>';
 else
 row += '<td class="missing"></td>';
 }
 row += '<td></td>';
 if (user.completedAll)
 row += '<td class="total">'+user.score+'</td>';
 else
 row += '<td class="total missing">'+user.score+'</td>';
 row += '</tr>';
 $("#users").append(row);
 }
}
body { text-align: left !important}
#leaderboard {
 width: 500px; 
}
#answer-list {
 padding: 10px;
 width: 290px;
 float: left;
}
#language-list {
 padding: 10px;
 width: 290px;
 float: left;
}
table thead {
 font-weight: bold;
}
table td {
 padding: 5px;
}
td.total {
 font-weight: bold;
 text-align: right;
}
td.missing {
 background: #bbbbbb;
}
<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="leaderboard">
 <h2>Leaderboard</h2>
 <p>
 Missing scores are shown as grey cells. A grey total indicates that the user has not participated in all challenges and is not eligible for the overall victory yet.
 </p>
 <table class="_user-list">
 <thead>
 <tr><td></td><td>User</td>
 <td><a href="http://codegolf.stackexchange.com/q/66068">#1</a></td>
 <td></td><td>Total</td>
 </tr>
 </thead>
 <tbody id="users">
 </tbody>
 </table>
</div>
<table style="display: none">
 <tbody id="answer-template">
 <tr><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>

Answer*

Draft saved
Draft discarded
Cancel

AltStyle によって変換されたページ (->オリジナル) /