Cette question a été inspirée par ce HNQ .
À propos de la série
Cette question fait maintenant partie d'une série sur la méthode AGM. Ce premier article de la série portera sur le calcul réel de laAGM
. Vous pouvez traiter cela comme n'importe quel autre défi de golf de code et y répondre sans vous soucier de la série. Cependant, il existe un classement pour tous les défis.
Quelle est la moyenne arithmétique – géométrique
La moyenne arithmétique – géométrique de deux nombres est définie comme le nombre vers lequel convergent les moyennes arithmétiques et géométriques. Votre tâche consiste à trouver ce numéro après quelques n
itérations.
Clarifications
- Vous prenez trois nombres,
a, b, n
dans n'importe quel format raisonnable.
- Pour les
n
itérations, prenez la moyenne arithmétique et géométrique de a
et b
et définissez-les sur a
et b
.
- Pour deux nombres
a
et b
, la moyenne arithmétique est définie comme(a + b) / 2
.
- La moyenne géométrique est définie comme
√(a * b)
.
a
et b
devraient se rapprocher.
- Ensuite, sortez les deux
a
et b
.
- Vous n'avez pas à vous soucier de l'imprécision du flotteur et autres.
- C'est le code-golf donc le code le plus court en octets gagne!
Cas de test
[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]
Classement
Volé de la série de Martin.
L'extrait suivant générera un classement de tous les défis de la série.
Pour vous assurer que vos réponses s'affichent, veuillez commencer chaque réponse par un titre, en utilisant le modèle Markdown 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
/* 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
oub
" -bien, lequel? Les deux ou l'un ou l'autre?Réponses:
CJam, 16 octets
Prend l'entrée sur la pile comme
a b n
oùa
etb
est double. Démo en lignela source
Dyalog APL ,
222115 octetsPrend ( a , b ) comme argument de droite et demande n :
(
+.×
produit scalaire de 0,5 et le bon argument,
suivi par×.*⍨
"puissance des points" de l'argument de droite et 0,5 *)⍣⎕
temps d'invite numérique appliqués.* "dot power" est comme un produit scalaire, mais en utilisant la multiplication et la puissance au lieu de plus et la multiplication, comme suit:
n
A ×.*⍨ B
est ∏ B i A = ∏ B 1 A B 2 Ai = 1
-3 octets grâce à ngn.
Ancienne version:
Prend
n
comme argument de gauche eta b
comme argument de droite.⊢⍵
Sur le RightArg(
...)⍣⍺
recalculez le LeftArg fois la(+/÷≢)
somme divisée par le décompte,
suivi de.5*⍨×/
la racine carrée du produit.Tous les cas de test:
la source
f⍣⍺⊢⍵
ou un idiome similaire que vous utilisez professionnellement?Of⍣core⊢TREE
sur miserver.dyalog.com (cliquez sur le grand "D" et faites défiler jusqu'à la ligne [266]).TI-BASIC, 22 octets
Fait exactement ce que dit l'algorithme. Prend N de l'invite, et A et B jusqu'à
Ans
une liste à deux éléments.Si N est 0, la
For(
boucle est entièrement ignorée.la source
JavaScript ES7,
4843 octets-5 grâce à Downgoat!
Fonction récursive très simple.
la source
(a*b)**.5
est plus court queMath.sqrt(a*b)
. exempleMATLAB / Octave,
6965 octetsla source
b=(a*b).^5
directement car vous ne réutilisez pas àb
nouveau dans cette itération et enregistrer 4 octets.Gelée, non compétitive
9 octets Cette réponse n'est pas concurrente, car elle utilise des fonctionnalités postérieures au défi.
Essayez-le en ligne!
Comment ça marche
la source
Sérieusement, 11 octets
Vidage hexadécimal:
Essayez-le en ligne
Explication:
la source
C ++,
108102100 octetsMerci à @RetoKoradi et @AlexA de m'avoir économisé 6 octets.
Ce n'est pas compétitif, car C ++ n'est pas un bon langage de golf. J'ai fait ça pour le plaisir :)
Il s'agit d'une fonction de récursivité simple, très similaire à la réponse JS.
la source
float
au lieu dedouble
est plus courte.#include
ligne.f(float*s)
qui prend un pointeur sur 3 flotteurs dans un "format raisonnable". Je ne sais pas si cela le raccourcit réellement.K5, 15 octets
Très littéral:
En action:
Malheureusement, cela ne fonctionne pas dans oK car cet interprète ne prend pas actuellement en charge la projection (curry) des adverbes. Fonctionne dans le vrai k5.
En ok, il faudrait actuellement envelopper la définition dans un lambda:
la source
J,
1813 octetsUsage:
la source
Japt , 24 octets
25 33Enregistré 9
7octets grâce à @ETHproductionsProfite de la déstructuration ES6.
Essayez-le en ligne
Ungolfed && Explication
la source
Uo
génère une plage de nombres de 0 à U, doncUo m@[V,W]=[V+W /2,(V*W q]
devrait fonctionner. (Non testé)U
autre que 1, produisant chaque boucle au fur et à mesure. En voici une qui fonctionne correctement:Uo £[VW]=[V+W /2(V*W q]};[VW]
r
semble fonctionner aussiMatlab, 54 octets
Exemple:
la source
Pyth, 12
Suite de tests
Explication
la source
@
et.O
, mais je ne connaissais même pas le nouveau but deE
.Minkolang v0.14, 23 octets
Essayez-le ici !
la source
Pyth, 15 octets
la source
Python 3,
6555 octetsMerci à mathmandan d'avoir indiqué une version plus courte en utilisant le
lambda
opérateur.Ma version originale:
À mon grand regret, une fonction récursive (à la manière des réponses JavaScript et C ++) était plus courte qu'une simple boucle for.
la source
lambda
l'if/else
opérateur ternaire :f=lambda a,b,n:f((a+b)/2,(a*b)**.5,n-1)if n else(a,b)
R, 66 octets
Usage:
la source
Mathematica,
3130 octetsUn octet enregistré grâce à Martin Büttner.
Usage:
la source
Lua, 62 octets
Utilise les arguments de ligne de commande de
...
pour attribuer àn
,a
etb
, astuce astucieuse que j'ai apprise sur Lua récemment.la source
Haskell, 40 octets
Une fonction anonyme. Exemple d'utilisation:
La fonction lambda
(\(a,b)->((a+b)/2,sqrt$a*b))
prend la moyenne arithmétique et géométrique sur un tuple. Il est itéré en commençant par la première entrée (un tuple), puis(!!)
indexe la deuxième entrée pour spécifier le nombre d'itérations.la source
Perl, 60 octets
NB: Par ce meta post , je crois que j'ai le bon score. Le code réel (entre guillemets simples) est de 58 caractères, puis j'ai ajouté +2 pour
a
etp
drapeaux car c'est la différence par rapport à l'invocation la plus courte,perl -e'...'
Plaintes vagues
J'ai ce sentiment persistant que je manque une amélioration évidente. Je sais, "bienvenue au golf de code", mais je veux dire plus que d'habitude je crois qu'il y a une occasion facile de raccourcir cela.
Au début, j'avais déconseillé d'utiliser
$\
le deuxième terme avec un certain succès, mais l'approche ci-dessus a fini par être 2 octets plus courte, même avec lesap
drapeaux supplémentaires requis. De même, éviter l'$_
affectation explicite serait bien, mais la boucle rend cela difficile.Les
shift@F
insectes me dérangent aussi; si je ne le fais pas de cette façon, (ou que j'utilise à la@F=(0,...,...)
place, ce qui ne sauve pas d'octets), il y a une erreur de coup par coup avec le@F
affectation.Exemple
Les sorties
la source
Julia, 49 octets
Algorithme itératif assez direct. L'utilisation du
√
symbole et du retour multiple économise quelques octets, mais la syntaxe de la boucle for en coûte quelques-uns.la source
Haskell, 47 octets
la source
Julia, 42 octets
Il s'agit d'une fonction récursive
f
qui accepte trois nombres et renvoie un tuple.Non golfé:
la source
LabVIEW, 21 primitives LabVIEW
Les primitives comptaient selon cette méta-publication .
assez simple, pas grand chose à expliquer.
la source
Python 2,
626162 octetsla source
CJam, 16 octets
Il s'agit d'une fonction anonyme. L'entrée est une liste avec les deux valeurs (en double), suivie du nombre d'itérations. Essayez-le en ligne avec du code d'E / S pour le tester.
Je n'aurais pas normalement posté cela parce que @PeterTaylor a posté une réponse CJam tout aussi longue avant de voir la question. Mais comme cela est annoncé comme le début d'une série, je voulais garder mes options ouvertes au cas où la série serait intéressante.
Bien que la longueur soit la même que la réponse de Peter, le code ne l'est pas. J'ai choisi un format d'entrée différent en prenant les deux valeurs dans une liste, où Peter a utilisé des valeurs distinctes. Donc, même s'il n'y a pas grand-chose avec l'un ou l'autre des formats d'entrée, le code semble très différent.
la source
Perl 6 ,
5347 octetsusage:
Si je change l'entrée de
a,b,n
à(a,b),n
je peux économiser quelques octets.usage:
Vraiment, j'échangerais le
... *
avec... -> (\a,\b) { a =~= b }
, alors il n'y aurait pas besoin du$^n
paramètre.(ne pas utiliser à la
==
place de=~=
, ou il peut ne pas s'arrêter)la source
Prolog, 80 octets
Code:
Exemple:
Essayez-le en ligne ici
la source
Java,
1039684 octetsVérifiez tous les cas de test.
Ancienne version (96 octets):
Ancienne version (103 octets):
la source