Esta pergunta foi inspirada por este HNQ .
Sobre a série
Esta pergunta agora faz parte de uma série sobre o método AGM. Este primeiro post da série será sobre como realmente calcular o AGM
. Você pode tratar isso como qualquer outro desafio de código de golfe e respondê-lo sem se preocupar com a série. No entanto, existe uma tabela de classificação em todos os desafios.
Qual é a média aritmética-geométrica
A média aritmética-geométrica de dois números é definida como o número para o qual converte repetidamente as médias aritmética e geométrica. Sua tarefa é encontrar esse número após algumas n
iterações.
Esclarecimentos
- Você pega três números,
a, b, n
em qualquer formato razoável.
- Por
n
iterações, tirar a média aritmética e geométrico de a
e b
e definida para aqueles a
e b
.
- Para dois números
a
e b
, a média aritmética é definida como (a + b) / 2
.
- A média geométrica é definida como
√(a * b)
.
a
e b
devem estar se aproximando.
- Em seguida, imprima ambos
a
e b
.
- Você não precisa se preocupar com a imprecisão da bóia e tal.
- Este é o código-golfe, pelo que o código mais curto em bytes vence!
Casos de teste
[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]
Entre os melhores
Roubado da série de Martin.
O trecho a seguir gerará uma tabela de classificação em todos os desafios da série.
Para garantir que suas respostas sejam exibidas, inicie todas as respostas com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N é o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# 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
" - bem, qual? Ambos, ou qualquer um?Respostas:
CJam, 16 bytes
Pega entrada na pilha como
a b n
ondea
eb
é dobra. Demonstração onlinefonte
Dyalog APL ,
222115 bytesAceita ( a , b ) como argumento correto e solicita n :
(
+.×
produto ponto de 0,5 e o argumento certo,
Seguido por×.*⍨
"ponto de poder" do argumento correto e 0,5 *)⍣⎕
tempos de solicitação numérica aplicados.* "ponto de poder" é como produto de ponto, mas usando multiplicação e poder em vez de mais e multiplicação, da seguinte maneira:
n
A ×.*⍨ B
é ∏ B i A = ∏ B 1 A B 2 Ai = 1
-3 bytes graças a ngn.
Versão antiga:
Toma
n
como argumento à esquerda ea b
como argumento à direita.⊢⍵
No RightArg(
...)⍣⍺
recalcule a(+/÷≢)
soma dos tempos do LeftArg dividida pelo registro,
seguido pela.5*⍨×/
raiz quadrada do produto.Todos os casos de teste:
fonte
f⍣⍺⊢⍵
ou um idioma similar que você usa profissionalmente?Of⍣core⊢TREE
em miserver.dyalog.com (clique no grande "D" e vá para a linha [266]).TI-BASIC, 22 bytes
Faz exatamente o que o algoritmo diz. Retorna N do prompt e A e B passam
Ans
por uma lista de dois elementos.Se N for 0, o
For(
loop será ignorado completamente.fonte
JavaScript ES7,
4843 bytes-5 graças a Downgoat!
Função recursiva muito simples.
fonte
(a*b)**.5
é mais curto queMath.sqrt(a*b)
. exemploMATLAB / oitava,
6965 bytesfonte
b=(a*b).^5
diretamente, pois não está reutilizandob
novamente nessa iteração e salvar 4 bytes.Gelatina, não concorrente
9 bytes Esta resposta não é concorrente, pois usa recursos que pós-datam o desafio.
Experimente online!
Como funciona
fonte
Sério, 11 bytes
Hex Dump:
Experimente online
Explicação:
fonte
C ++,
108102100 bytesObrigado a @RetoKoradi e @AlexA por me salvarem 6 bytes.
Isso não é competitivo, porque o C ++ não é uma boa linguagem de golfe. Fiz isso por diversão :)
Esta é uma função de recursão simples, muito semelhante à resposta JS.
fonte
float
vez dedouble
é mais curto.#include
linha.f(float*s)
que leva um ponteiro para 3 carros alegóricos para estar em um "formato razoável". Não tenho certeza se isso realmente diminui.K5, 15 bytes
Muito literal:
Em ação:
Infelizmente, isso não funciona bem porque esse intérprete atualmente não suporta projeção (currying) de advérbios. Funciona no verdadeiro k5.
No oK, atualmente seria necessário agrupar a definição em um lambda:
fonte
J,
1813 bytesUso:
fonte
Japt , 24 bytes
25 33Guardado 9
7bytes graças a @ETHproductionsAproveita a desestruturação do ES6.
Experimente online
Ungolfed && Explicação
fonte
Uo
gera um intervalo de números de 0 a U, portanto,Uo m@[V,W]=[V+W /2,(V*W q]
deve funcionar. (Não testado)U
outro que não seja 1, produzindo cada loop à medida que avança. Aqui está uma que funciona corretamente:Uo £[VW]=[V+W /2(V*W q]};[VW]
r
parecia trabalho tambémMatlab, 54 bytes
Exemplo:
fonte
Pyth, 12
Suíte de teste
Explicação
fonte
@
e.O
, mas eu nem conhecia o novo objetivoE
.Minkolang v0.14, 23 bytes
Experimente aqui !
fonte
Pitão, 15 bytes
fonte
Python 3,
6555 bytesAgradecemos a mathmandan por apontar uma versão mais curta usando o
lambda
operador.Minha versão original:
Para meu desgosto, uma função recursiva (à la as respostas JavaScript e C ++) era mais curta do que um simples loop for.
fonte
lambda
e com oif/else
operador ternário :f=lambda a,b,n:f((a+b)/2,(a*b)**.5,n-1)if n else(a,b)
R, 66 bytes
Uso:
fonte
Mathematica,
3130 bytesGuardou um byte graças a Martin Büttner.
Uso:
fonte
Lua, 62 bytes
Usa argumentos de linha de comando
...
para atribuir an
,a
eb
, um truque bacana que aprendi sobre Lua recentemente.fonte
Haskell, 40 bytes
Uma função anônima. Exemplo de uso:
A função lambda
(\(a,b)->((a+b)/2,sqrt$a*b))
assume a média aritmética e geométrica em uma tupla. Isso é iterado a partir da primeira entrada (uma tupla) e(!!)
indexa a segunda entrada para especificar o número de iterações.fonte
Perl, 60 bytes
NB: Por este meta post , acredito que tenho a pontuação correta. O código real (entre aspas simples) tem 58 caracteres e adicionei +2 para
a
ep
sinalizadores, pois essa é a diferença da menor chamada,perl -e'...'
Reclamações vagas
Tenho essa sensação incômoda de que estou perdendo uma melhoria óbvia. Eu sei, "bem-vindo ao código do golfe", mas quero dizer mais do que o habitual , acredito que haja uma oportunidade fácil de encurtar isso.
No começo, eu tinha mexido com o uso
$\
do segundo termo com algum sucesso, mas a abordagem acima acabou sendo 2 bytes mais curta, mesmo com osap
sinalizadores extras necessários. Da mesma forma, evitar a$_
atribuição explícita seria bom, mas o loop torna isso difícil.Os
shift@F
insetos também; se eu não fizer dessa maneira (ou usar@F=(0,...,...)
, o que não salva bytes), há um erro de um por um na@F
atribuição.Exemplo
Saídas
fonte
Julia, 49 bytes
Algoritmo iterativo bastante direto. O uso do
√
símbolo e o retorno múltiplo economiza alguns bytes, mas a sintaxe do loop for custa alguns.fonte
Haskell, 47 bytes
fonte
Julia, 42 bytes
Esta é uma função recursiva
f
que aceita três números e retorna uma tupla.Ungolfed:
fonte
LabVIEW, 21 primitivas do LabVIEW
Primitivas contadas de acordo com esta meta post .
bastante direto, não há muito o que explicar.
fonte
Python 2,
626162 bytesfonte
CJam, 16 bytes
Esta é uma função anônima. A entrada é uma lista com os dois valores (como dobras), seguidos pela contagem da iteração. Experimente online com código de E / S para teste.
Normalmente, eu não teria postado isso porque @PeterTaylor postou uma resposta CJam igualmente longa antes de fazer a pergunta. Mas como isso é anunciado como o início de uma série, eu queria manter minhas opções em aberto, caso a série seja interessante.
Enquanto o comprimento é o mesmo que a resposta de Peter, o código não é. Eu escolhi um formato de entrada diferente, colocando os dois valores em uma lista, onde Peter usou valores separados. Portanto, embora não haja muito com os dois formatos de entrada, o código parece bem diferente.
fonte
Perl 6 ,
5347 bytesuso:
Se eu alterar a entrada de
a,b,n
para(a,b),n
, posso salvar alguns bytes.uso:
Realmente eu trocaria o
... *
com... -> (\a,\b) { a =~= b }
, então não haveria necessidade do$^n
parâmetro.(não use em
==
vez de=~=
ou pode não parar)fonte
Prolog, 80 bytes
Código:
Exemplo:
Experimente online aqui
fonte
Java,
1039684 bytesVerifique todos os casos de teste.
Versão antiga (96 bytes):
Versão antiga (103 bytes):
fonte