Esta pregunta fue inspirada por este HNQ .
Sobre la serie
Esta pregunta ahora es parte de una serie sobre el método AGM. Esta primera publicación de la serie tratará sobre el cálculo real AGM
. Puede tratar esto como cualquier otro desafío de código de golf y responderlo sin preocuparse por la serie. Sin embargo, hay una tabla de clasificación en todos los desafíos.
¿Qué es la media aritmética-geométrica?
La media aritmética-geométrica de dos números se define como el número al que convergen repetidamente los medios aritméticos y geométricos. Su tarea es encontrar este número después de algunas n
iteraciones.
Aclaraciones
- Toma tres números,
a, b, n
en cualquier formato razonable.
- Para
n
iteraciones, tomar la media aritmética y geométrica de a
y b
y establecer aquellos a a
y b
.
- Para dos números
a
y b
, la media aritmética se define como (a + b) / 2
.
- La media geométrica se define como
√(a * b)
.
a
y b
deberían acercarse el uno al otro.
- Entonces, salida ambos
a
y b
.
- No tiene que preocuparse por la imprecisión del flotador y demás.
- Este es el código de golf, ¡el código más corto en bytes gana!
Casos de prueba
[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]
Tabla de clasificación
Robado de la serie de Martin.
El siguiente fragmento generará una tabla de clasificación en todos los desafíos de la serie.
Para asegurarse de que sus respuestas aparezcan, comience cada respuesta con un título, utilizando la siguiente plantilla de Markdown:
# Language Name, N bytes
donde N es el tamaño de su envío. Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# 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
ob
", ¿cuál? ¿Ambos o uno de los dos?Respuestas:
CJam, 16 bytes
Toma la entrada en la pila como
a b n
dondea
yb
son dobles. Demostración en líneafuente
Dyalog APL ,
222115 bytesToma ( a , b ) como argumento correcto y solicita n :
(
+.×
producto punto de 0.5 y el argumento correcto,
seguido por×.*⍨
"punto de poder" del argumento correcto y 0.5 *)⍣⎕
tiempos de solicitud numéricos aplicados.* "dot power" es como un producto dot, pero usa multiplicación y potencia en lugar de más y multiplicación, de la siguiente manera:
n
A ×.*⍨ B
es ∏ B i A = ∏ B 1 A B 2 Ai = 1
-3 bytes gracias a ngn.
Versión antigua:
Toma
n
como argumento izquierdo ya b
como argumento derecho.⊢⍵
En el RightArg(
...)⍣⍺
recalcule la(+/÷≢)
suma de veces LeftArg dividida por el recuento,
seguido por.5*⍨×/
la raíz cuadrada del producto.Todos los casos de prueba:
fuente
f⍣⍺⊢⍵
o similar un idioma que utilizas profesionalmente?Of⍣core⊢TREE
en miserver.dyalog.com (haga clic en la "D" grande y desplácese hasta la línea [266]).TI-BASIC, 22 bytes
Hace exactamente lo que dice el algoritmo. Toma N del indicador y A y B
Ans
como una lista de dos elementos.Si N es 0, el
For(
bucle se omite por completo.fuente
JavaScript ES7,
4843 bytes-5 gracias a Downgoat!
Función recursiva muy simple.
fuente
(a*b)**.5
es más corto queMath.sqrt(a*b)
. ejemploMATLAB / Octave,
6965 bytesfuente
b=(a*b).^5
directamente ya que no está reutilizandob
nuevamente en esa iteración y guardar 4 bytes.Gelatina, no competidora
9 bytes Esta respuesta no es competitiva, ya que utiliza características que son posteriores al desafío.
Pruébalo en línea!
Cómo funciona
fuente
En serio, 11 bytes
Hex Dump:
Pruébalo en línea
Explicación:
fuente
C ++,
108102100 bytesGracias a @RetoKoradi y @AlexA por guardarme 6 bytes.
Esto no es competitivo, porque C ++ no es un buen lenguaje de golf. Hice esto por diversión :)
Esta es una función de recursión simple, muy similar a la respuesta JS.
fuente
float
lugar dedouble
es más corto.#include
línea.f(float*s)
que lleva un puntero a 3 flotantes en un "formato razonable". No estoy seguro si eso realmente lo hace más corto.K5, 15 bytes
Muy literal:
En acción:
Desafortunadamente, esto no funciona en OK porque ese intérprete no admite actualmente la proyección (currículum) de adverbios. Funciona en el real k5.
En OK, actualmente sería necesario ajustar la definición en una lambda:
fuente
J,
1813 bytesUso:
fuente
Japt , 24 bytes
25 33Guardado 9
7bytes gracias a @ETHproductionsAprovecha la desestructuración de ES6.
Pruébalo en línea
Ungolfed && Explicación
fuente
Uo
genera un rango de números de 0 a U, por lo queUo m@[V,W]=[V+W /2,(V*W q]
debería funcionar. (No probado)U
otro que no sea 1, generando cada ciclo a medida que avanza. Aquí hay uno que funciona correctamente:Uo £[VW]=[V+W /2(V*W q]};[VW]
r
parecía funcionarMatlab, 54 bytes
Ejemplo:
fuente
Pyth, 12
Banco de pruebas
Explicación
fuente
@
y.O
, pero ni siquiera sabía el nuevo propósito deE
.Minkolang v0.14, 23 bytes
Pruébalo aquí !
fuente
Pyth, 15 bytes
fuente
Python 3,
6555 bytesGracias a Mathmandan por señalar una versión más corta usando el
lambda
operadorMi versión original:
Para mi disgusto, una función recursiva (como las respuestas de JavaScript y C ++) era más corta que un simple bucle for.
fuente
lambda
y elif/else
operador ternario :f=lambda a,b,n:f((a+b)/2,(a*b)**.5,n-1)if n else(a,b)
R, 66 bytes
Uso:
fuente
Mathematica,
3130 bytesGuardado un byte gracias a Martin Büttner.
Uso:
fuente
Lua, 62 bytes
Usos comando argumentos de la línea de
...
asignar an
,a
yb
, un ingenioso truco que aprendí sobre Lua recientemente.fuente
Haskell, 40 bytes
Una función anónima. Ejemplo de uso:
La función lambda
(\(a,b)->((a+b)/2,sqrt$a*b))
toma la media aritmética y geométrica en una tupla. Esto se repite comenzando con la primera entrada (una tupla) y luego(!!)
indexa la segunda entrada para especificar el número de iteraciones.fuente
Perl, 60 bytes
NB: Según esta meta publicación , creo que tengo la puntuación correcta. El código real (entre comillas simples) es de 58 caracteres, luego agregué +2 para
a
yp
marcas, ya que esa es la diferencia con la invocación más corta,perl -e'...'
Quejas vagas
Tengo la sensación de que me falta una mejora obvia. Lo sé, "bienvenido al código de golf", pero quiero decir más de lo habitual , creo que hay una oportunidad fácil para acortar esto.
Al principio, había tenido problemas con el uso
$\
como segundo término con cierto éxito, pero el enfoque anterior terminó siendo 2 bytes más corto, incluso con losap
indicadores adicionales necesarios. Del mismo modo, evitar la$_
asignación explícita sería bueno, pero el ciclo lo dificulta.A
shift@F
mí también me molesta; Sin embargo, si no lo hago de esa manera (o uso@F=(0,...,...)
en su lugar, que no guarda ningún byte), hay un error de uno por uno con la@F
asignación.Ejemplo
Salidas
fuente
Julia, 49 bytes
Algoritmo iterativo bastante directo. El uso del
√
símbolo y el retorno múltiple ahorra algunos bytes, pero la sintaxis del bucle for cuesta unos pocos.fuente
Haskell, 47 Bytes
fuente
Julia, 42 bytes
Esta es una función recursiva
f
que acepta tres números y devuelve una tupla.Sin golf:
fuente
LabVIEW, 21 primitivas de LabVIEW
Las primitivas cuentan según esta meta publicación .
bastante directo, no hay mucho que explicar.
fuente
Python 2,
626162 bytesfuente
CJam, 16 bytes
Esta es una función anónima. La entrada es una lista con los dos valores (como dobles), seguida del recuento de iteraciones. Pruébelo en línea con el código de E / S para realizar pruebas.
Normalmente no habría publicado esto porque @PeterTaylor publicó una respuesta CJam igualmente larga antes de ver la pregunta. Pero dado que esto se anuncia como el comienzo de una serie, quería mantener abiertas mis opciones en caso de que la serie sea interesante.
Si bien la longitud es la misma que la respuesta de Peter, el código no lo es. Elegí un formato de entrada diferente al tomar los dos valores en una lista, donde Peter usó valores separados. Entonces, aunque no hay mucho con ninguno de los formatos de entrada, el código se ve bastante diferente.
fuente
Perl 6 ,
5347 bytesuso:
Si cambio la entrada de
a,b,n
a(a,b),n
puedo guardar algunos bytes.uso:
Realmente cambiaría el
... *
con... -> (\a,\b) { a =~= b }
, entonces no habría necesidad del$^n
parámetro.(no use en
==
lugar de=~=
, o puede que no se detenga)fuente
Prólogo, 80 bytes
Código:
Ejemplo:
Pruébalo en línea aquí
fuente
Java,
1039684 bytesVerifique todos los casos de prueba.
Versión anterior (96 bytes):
Versión anterior (103 bytes):
fuente