Diese Frage wurde von diesem HNQ inspiriert .
Über die Serie
Diese Frage ist nun Teil einer Reihe zur AGM-Methode. In diesem ersten Beitrag der Reihe geht es um die Berechnung der AGM
. Sie können dies wie jede andere Code-Golf-Herausforderung behandeln und beantworten, ohne sich Gedanken über die Serie zu machen. Es gibt jedoch eine Rangliste für alle Herausforderungen.
Was ist das arithmetisch-geometrische Mittel?
Der arithmetisch-geometrische Mittelwert zweier Zahlen ist definiert als die Zahl, zu der die arithmetischen und geometrischen Mittelwerte wiederholt konvergieren. Ihre Aufgabe ist es, diese Nummer nach einigen n
Iterationen zu finden.
Klarstellungen
- Sie nehmen drei Zahlen
a, b, n
in jedem vernünftigen Format.
n
Nehmen Sie für Iterationen den arithmetischen und geometrischen Mittelwert von a
und b
und setzen Sie diese auf a
und b
.
- Für zwei Zahlen
a
und b
ist das arithmetische Mittel definiert als (a + b) / 2
.
- Das geometrische Mittel ist definiert als
√(a * b)
.
a
und b
sollten sich nähern.
- Dann geben Sie beide
a
und aus b
.
- Sie müssen sich keine Gedanken über die Ungenauigkeit des Schwimmers machen.
- Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes !
Testfälle
[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]
Bestenliste
Aus Martins Serie gestohlen.
Das folgende Snippet generiert eine Rangliste für alle Herausforderungen der Serie.
Um sicherzustellen, dass Ihre Antworten angezeigt werden, beginnen Sie jede Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wobei N die Größe Ihrer Einreichung ist. Wenn Sie Ihre Punktzahl verbessern, können Sie alte Punkte in der Überschrift behalten, indem Sie sie durchstreichen. Zum Beispiel:
# 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
oderb
" - nun, welches? Beides oder beides?Antworten:
CJam, 16 Bytes
Übernimmt die Eingabe auf dem Stapel als
a b n
woa
undb
sind verdoppelt. Online-Demoquelle
Dyalog APL ,
222115 BytesNimmt ( a , b ) als rechtes Argument und fordert zur Eingabe von n auf :
(
+.×
Skalarprodukt von 0,5 und das richtige Argument,
gefolgt von×.*⍨
"Punktstärke" des richtigen Arguments und 0,5 *)⍣⎕
verwendete numerische Eingabeaufforderungszeiten.* "Punktleistung" ist wie Punktprodukt, verwendet jedoch Multiplikation und Potenz anstelle von Plus und Multiplikation wie folgt:
n
A ×.*⍨ B
ist Π B i A = Π B 1 A B 2 Ai = 1
-3 Bytes dank ngn.
Alte Version:
Nimmt
n
als linkes Argument unda b
als rechtes Argument.⊢⍵
Auf der rechten Seite(
...)⍣⍺
berechnen Sie die LeftArg- Zeitsumme(+/÷≢)
geteilt durch die Summe,
gefolgt von.5*⍨×/
der Quadratwurzel des Produkts neu.Alle Testfälle:
quelle
f⍣⍺⊢⍵
oder ähnlich eine Redewendung, die Sie professionell verwenden?Of⍣core⊢TREE
bei miserver.dyalog.com (klicken Sie auf den großen „D“ und navigieren Sie zu der Zeile [266]).TI-BASIC, 22 Bytes
Tut genau das, was der Algorithmus sagt. Nimmt N von der Eingabeaufforderung und A und B
Ans
als Liste mit zwei Elementen durch.Wenn N 0 ist, wird die
For(
Schleife vollständig übersprungen.quelle
JavaScript ES7,
4843 Bytes-5 danke an Downgoat!
Sehr einfache rekursive Funktion.
quelle
(a*b)**.5
ist kürzer alsMath.sqrt(a*b)
. BeispielMATLAB / Octave,
6965 Bytesquelle
b=(a*b).^5
direkt tun, da Sieb
in dieser Iteration nicht mehr wiederverwenden und 4 Bytes sparen.Gelee, nicht konkurrierend
9 Bytes Diese Antwort ist nicht konkurrierend, da sie Funktionen verwendet, die die Herausforderung nachholen.
Probieren Sie es online!
Wie es funktioniert
quelle
Im Ernst, 11 Bytes
Hex Dump:
Probieren Sie es online aus
Erläuterung:
quelle
C ++,
108102100 BytesVielen Dank an @RetoKoradi und @AlexA, dass sie mir 6 Bytes gespart haben.
Dies ist nicht wettbewerbsfähig, da C ++ keine gute Golfsprache ist. Habe das zum Spaß gemacht :)
Dies ist eine einfache Rekursionsfunktion, die der JS-Antwort sehr ähnlich ist.
quelle
float
anstelle vondouble
kürzer.#include
Zeile entfernen .f(float*s)
welcher Zeiger auf 3 Floats ein "vernünftiges Format" hat. Ich bin mir nicht sicher, ob es dadurch tatsächlich kürzer wird.K5, 15 Bytes
Sehr wörtlich:
In Aktion:
Leider funktioniert dies in OK nicht, da dieser Interpreter derzeit keine Projektion (Currying) von Adverbien unterstützt. Funktioniert im echten k5.
In oK müsste die Definition derzeit in ein Lambda eingeschlossen werden:
quelle
J,
1813 BytesVerwendung:
quelle
Japt , 24 Bytes
25 339
7Bytes dank @ETHproductions gespeichertNutzt die Vorteile der ES6-Destrukturierung.
Probieren Sie es online aus
Ungolfed && Erklärung
quelle
Uo
generiert einen Zahlenbereich von 0 bis U,Uo m@[V,W]=[V+W /2,(V*W q]
sollte also funktionieren. (Ungetestet)U
anderen als 1 fehl und gibt jede Schleife so wie sie ist aus. Hier ist eine, die richtig funktioniert:Uo £[VW]=[V+W /2(V*W q]};[VW]
r
schien auch zu funktionierenMatlab, 54 Bytes
Beispiel:
quelle
Pyth, 12
Test Suite
Erläuterung
quelle
@
und.O
, aber ich wusste nicht einmal den neuen Zweck vonE
.Minkolang v0.14, 23 Bytes
Probieren Sie es hier aus !
quelle
Pyth, 15 Bytes
quelle
Python 3,
65-55BytesVielen Dank an mathmandan, der mithilfe des
lambda
Operators auf eine kürzere Version hingewiesen hat .Meine ursprüngliche Version:
Zu meinem Leidwesen war eine rekursive Funktion (a la JavaScript und C ++ Antworten) kürzer als eine einfache for-Schleife.
quelle
lambda
und dem ternärenif/else
Operator ein wenig verkürzen :f=lambda a,b,n:f((a+b)/2,(a*b)**.5,n-1)if n else(a,b)
R, 66 Bytes
Verwendung:
quelle
Mathematica,
31-30BytesEin Byte gespart dank Martin Büttner.
Verwendung:
quelle
Lua, 62 Bytes
Verwendet Befehlszeilenargumente von
...
, um und einen raffinierten Trick zuzuweisenn
, den ich kürzlich über Lua gelernt habe.a
b
quelle
Haskell, 40 Bytes
Eine anonyme Funktion. Anwendungsbeispiel:
Die Lambda-Funktion
(\(a,b)->((a+b)/2,sqrt$a*b))
berechnet den arithmetischen und geometrischen Mittelwert eines Tupels. Dies wird beginnend mit der ersten Eingabe (einem Tupel) iteriert und anschließend(!!)
die zweite Eingabe indiziert, um die Anzahl der Iterationen anzugeben.quelle
Perl, 60 Bytes
NB: Nach diesem Meta-Post , glaube ich ich das Scoring richtig haben. Der tatsächliche Code (zwischen einfachen Anführungszeichen) besteht aus 58 Zeichen. Dann habe ich +2 für
a
undp
flags hinzugefügt , da dies der Unterschied zum kürzesten Aufruf ist.perl -e'...'
Vage Beschwerden
Ich habe das quälende Gefühl, dass mir eine offensichtliche Verbesserung fehlt. Ich weiß, "Willkommen beim Code Golf", aber ich meine mehr als üblich ich glaube, es gibt eine einfache Möglichkeit, dies zu verkürzen.
Schon früh hatte ich
$\
mit einigem Erfolg daran herumgespielt, als zweiten Term zu verwenden, aber der obige Ansatz endete damit, dass er 2 Bytes kürzer war, obwohl die zusätzlichenap
Flags erforderlich waren. Ebenso das explizite vermeiden$_
wäre es schön, Zuweisung zu , aber die Schleife erschwert dies.Das
shift@F
nervt mich auch; Wenn ich es jedoch nicht so mache (oder@F=(0,...,...)
stattdessen verwende, wodurch keine Bytes gespart werden), liegt ein Fehler von eins zu eins vor@F
Zuweisung vor.Beispiel
Ausgänge
quelle
Julia, 49 Bytes
Ziemlich direkter iterativer Algorithmus. Die Verwendung des
√
Symbols und der Mehrfachrückgabe spart einige Bytes, die for-Schleifensyntax jedoch einige.quelle
Haskell, 47 Bytes
quelle
Julia, 42 Bytes
Dies ist eine rekursive Funktion
f
, die drei Zahlen akzeptiert und ein Tupel zurückgibt.Ungolfed:
quelle
LabVIEW, 21 LabVIEW-Grundelemente
Primitive wurden gemäß diesem Metapost gezählt .
ziemlich ehrlich, nicht viel zu erklären.
quelle
Python 2,
626162 Bytesquelle
CJam, 16 Bytes
Dies ist eine anonyme Funktion. Die Eingabe ist eine Liste mit den beiden Werten (als Doppel), gefolgt von der Iterationszahl. Probieren Sie es online aus mit E / A-Code zum Testen aus.
Normalerweise hätte ich das nicht gepostet, weil @PeterTaylor eine ebenso lange CJam-Antwort gepostet hat, bevor ich die Frage sah. Da dies jedoch als Beginn einer Serie beworben wird, wollte ich meine Optionen offen halten, falls die Serie interessant ist.
Die Länge entspricht der Antwort von Peter, der Code jedoch nicht. Ich habe ein anderes Eingabeformat gewählt, indem ich die beiden Werte in eine Liste aufgenommen habe, in der Peter separate Werte verwendet hat. Obwohl es bei beiden Eingabeformaten nicht viel zu tun gibt, sieht der Code ganz anders aus.
quelle
Perl 6 ,
5347 BytesVerwendung:
Wenn ich die Eingabe von
a,b,n
auf ändere ,(a,b),n
kann ich ein paar Bytes sparen.Verwendung:
Wirklich würde ich die Swap
... *
mit... -> (\a,\b) { a =~= b }
, dann gäbe es keine Notwendigkeit für den seinen$^n
Parameter.(nicht
==
anstelle von verwenden=~=
, oder es kann nicht aufhören)quelle
Prolog, 80 Bytes
Code:
Beispiel:
Probieren Sie es hier online aus
quelle
Java,
1039684 BytesÜberprüfen Sie alle Testfälle.
Alte Version (96 Bytes):
Alte Version (103 Bytes):
quelle