Этот вопрос был вдохновлен этим HNQ .
О серии
Этот вопрос теперь является частью серии о методе AGM. Этот первый пост в серии будет о фактическом вычислении AGM
. Вы можете относиться к этому, как к любому другому вызову для игры в гольф, и отвечать на него, не беспокоясь о серии вообще. Тем не менее, существует таблица лидеров по всем задачам.
Что такое среднее арифметическое?
Арифметико-геометрическое среднее из двух чисел определяются как число , которое неоднократно принимая арифметический и геометрическим означает , сходится к. Ваша задача - найти это число после нескольких n
итераций.
Разъяснения
- Вы берете три числа
a, b, n
в любом разумном формате.
- Для
n
итераций возьмите среднее арифметическое и геометрическое из a
и b
и установите их в a
и b
.
- Для двух чисел
a
и b
среднее арифметическое определяется как (a + b) / 2
.
- Среднее геометрическое определяется как
√(a * b)
.
a
и b
должны приближаться друг к другу.
- Затем выведите оба
a
и b
.
- Вам не нужно беспокоиться о неточности поплавка и тому подобное.
- Это код-гольф, поэтому выигрывает самый короткий код в байтах !
Тестовые случаи
[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
Похищен из серии Мартина.
Следующий фрагмент создаст таблицу лидеров по всем задачам серии.
Чтобы убедиться, что ваши ответы отображаются, начните каждый ответ с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N - размер вашей заявки. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# 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&]*(?:<(?:s>((?!>).)*<\/s>|((?!>).)+>)[^\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>
a
илиb
" - ну, какой? Оба или один?Ответы:
CJam, 16 байтов
Принимает вход в стек как
a b n
гдеa
иb
являются двойными. Онлайн демоисточник
Дьялог АПЛ ,
222115 байтПринимает ( a , b ) в качестве правильного аргумента и запрашивает n :
(
+.×
скалярное произведение 0,5 и правильный аргумент,
с последующим×.*⍨
«Точечная сила» правильного аргумента и 0,5 *)⍣⎕
применяется числовое-быстрое время.* «Точечная сила» подобна точечному произведению, но использует умножение и мощность вместо плюса и умножения следующим образом:
n
A ×.*⍨ B
является ∏ B i A = ∏ B 1 A B 2 Ai = 1
-3 байта благодаря ngn.
Старая версия:
Принимает
n
как левый аргумент иa b
как правый аргумент.⊢⍵
На RightArg(
...)⍣⍺
пересчитать(+/÷≢)
сумму левых времен LeftArg, деленную на подсчет,,
за которым следует.5*⍨×/
квадратный корень из произведения.Все тестовые случаи:
источник
f⍣⍺⊢⍵
или аналогичный идиом вы используете профессионально?Of⍣core⊢TREE
на miserver.dyalog.com (нажмите большую букву «D» и выделите строку [266]).TI-BASIC, 22 байта
Делает именно то, что говорит алгоритм. Принимает N из приглашения, а A и B -
Ans
как двухэлементный список.Если N равно 0,
For(
цикл полностью пропускается.источник
JavaScript ES7,
4843 байта-5 спасибо Downgoat!
Очень простая рекурсивная функция.
источник
(a*b)**.5
короче чемMath.sqrt(a*b)
. примерMATLAB / Octave,
6965 байтисточник
b=(a*b).^5
напрямую, так как вы больше не будете повторно использоватьb
в этой итерации и сохранить 4 байта.Желе неконкурентоспособное
9 байт. Этот ответ не является конкурирующим, поскольку в нем используются функции, которые устарели.
Попробуйте онлайн!
Как это работает
источник
Серьезно, 11 байтов
Шестнадцатеричный дамп:
Попробуйте онлайн
Объяснение:
источник
С ++,
108102100 байтСпасибо @RetoKoradi и @AlexA за то, что сэкономили мне 6 байтов.
Это неконкурентоспособно, потому что C ++ не является хорошим языком игры в гольф. Сделал это для развлечения :)
Это простая функция рекурсии, очень похожая на ответ JS.
источник
float
вместоdouble
короче.#include
строке.f(float*s)
что указатель на 3 числа с плавающей точкой находится в «разумном формате». Не уверен, что это на самом деле делает его короче.К5, 15 байт
Очень буквально:
В бою:
К сожалению, это не работает в ОК, потому что этот переводчик в настоящее время не поддерживает проекцию (карри) наречий. Работает в режиме реального k5.
В порядке, в настоящее время необходимо заключить определение в лямбду:
источник
J,
1813 байтИспользование:
источник
Japt , 24 байта
25 33Сохранено 9
7байт благодаря @ETHproductionsИспользует преимущества ES6.
Попробуйте онлайн
Ungolfed && Объяснение
источник
Uo
генерирует диапазон чисел от 0 до U, поэтомуUo m@[V,W]=[V+W /2,(V*W q]
должен работать. (Не проверено)U
кроме 1, выводя каждую петлю, как она идет. Вот тот, который работает должным образом:Uo £[VW]=[V+W /2(V*W q]};[VW]
r
похоже, тоже работаетMatlab, 54 байта
Пример:
источник
Пиф, 12
Тестирование
объяснение
источник
@
и.O
, но я даже не знал о новой целиE
.Минколанг v0.14, 23 байта
Попробуй это здесь !
источник
Pyth, 15 байт
источник
Питон 3,
6555 байтСпасибо mathmandan за указание более короткой версии с использованием
lambda
оператора.Моя оригинальная версия:
К моему огорчению, рекурсивная функция (а-ля ответы JavaScript и C ++) была короче простого цикла for.
источник
lambda
и троичногоif/else
оператора:f=lambda a,b,n:f((a+b)/2,(a*b)**.5,n-1)if n else(a,b)
R, 66 байт
Использование:
источник
Mathematica,
3130 байтСохранено один байт благодаря Мартину Бюттнеру.
Использование:
источник
Lua, 62 байта
Использует аргументы командной строки from,
...
чтобы назначитьn
,a
иb
отличный трюк, который я недавно узнал о Lua.источник
Haskell, 40 байт
Анонимная функция. Пример использования:
Лямбда-функция
(\(a,b)->((a+b)/2,sqrt$a*b))
принимает среднее арифметическое и геометрическое значение для кортежа. Это повторяется, начиная с первого ввода (кортежа), а затем(!!)
индексирует второй ввод для указания количества итераций.источник
Perl, 60 байт
NB: Согласно этому мета-посту , я считаю, что у меня правильная оценка. Фактический код (между одинарными кавычками) составляет 58 символов, затем я добавил +2 для
a
иp
флаги, так как это отличие от кратчайшего вызоваperl -e'...'
Смутные жалобы
У меня есть это ноющее чувство, я пропускаю очевидное улучшение. Я знаю, «добро пожаловать в код гольф», но я имею в виду больше, чем обычно я считаю, что есть простая возможность сократить это.
Вначале я
$\
с некоторым успехом возился с использованием в качестве второго термина, но вышеприведенный подход оказался на 2 байта короче, даже с необходимыми дополнительнымиap
флагами. Точно так же$_
было бы неплохо избежать явного присваивания, но цикл усложняет это.Эти
shift@F
ошибки мне тоже; если я не делаю так, хотя (или использую@F=(0,...,...)
вместо этого, который не сохраняет байты), то с@F
присваиванием возникает ошибочная ошибка .пример
Выходы
источник
Юлия, 49 байт
Довольно прямой итерационный алгоритм. Использование
√
символа и множественного возврата экономит несколько байтов, но синтаксис цикла for стоит несколько.источник
Haskell, 47 байт
источник
Юлия, 42 байта
Это рекурсивная функция,
f
которая принимает три числа и возвращает кортеж.Ungolfed:
источник
LabVIEW, 21 примитив LabVIEW
Примитивы считаются согласно этому мета-посту .
довольно просто, не так много, чтобы объяснить.
источник
Python 2,
626162 байтаисточник
CJam, 16 байтов
Это анонимная функция. Входные данные представляют собой список с двумя значениями (в виде двойных чисел), за которыми следует число итераций. Попробуйте онлайн с кодом ввода / вывода для тестирования.
Обычно я бы этого не написал, потому что @PeterTaylor опубликовал такой же длинный ответ CJam, прежде чем я увидел вопрос. Но так как это рекламируется как начало серии, я хотел оставить свои варианты открытыми на случай, если серия будет интересной.
Хотя длина совпадает с ответом Петра, код - нет. Я выбрал другой формат ввода, взяв два значения в списке, где Питер использовал отдельные значения. Так что, хотя в любом из форматов ввода ничего особенного нет, код выглядит совершенно иначе.
источник
Perl 6 ,
5347 байтиспользование:
Если я изменю ввод с
a,b,n
на(a,b),n
я могу сохранить несколько байтов.использование:
На самом деле я бы поменял с
... *
with... -> (\a,\b) { a =~= b }
, тогда не было бы необходимости в$^n
параметре.(не используйте
==
вместо=~=
или не остановите)источник
Пролог, 80 байт
Код:
Пример:
Попробуйте онлайн здесь
источник
Java,
1039684 байтаПроверьте все тестовые случаи.
Старая версия (96 байт):
Старая версия (103 байта):
источник