To pytanie zostało zainspirowane tym HNQ .
O serii
To pytanie jest teraz częścią serii dotyczącej metody AGM. Ten pierwszy post z serii będzie dotyczył obliczania AGM
. Możesz traktować to jak każde inne wyzwanie związane z golfem i odpowiedzieć na nie, nie martwiąc się w ogóle serią. Istnieje jednak tabela wyników dla wszystkich wyzwań.
Co to jest średnia arytmetyczno-geometryczna
Arytmetyczno-średnia geometryczna z dwóch liczb jest definiowana jako liczba że wielokrotnie biorąc Środkach arytmetyczne i geometryczne zbiegają się. Twoim zadaniem jest znalezienie tego numeru po kilku n
iteracjach.
Wyjaśnienia
- Bierzesz trzy liczby,
a, b, n
w dowolnym rozsądnym formacie.
- Dla
n
iteracji, wziąć średnią arytmetyczną i średnią geometryczną a
i b
i ustaw tych, a
a b
.
- Dla dwóch liczb
a
i b
średnią arytmetyczną definiuje się jako (a + b) / 2
.
- Średnia geometryczna jest zdefiniowana jako
√(a * b)
.
a
i b
powinni się do siebie zbliżać.
- Następnie wypisz zarówno
a
i b
.
- Nie musisz się martwić niedokładnością pływaka i tym podobne.
- To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach !
Przypadki testowe
[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]
Tabela liderów
Skradziony z serii Martina.
Poniższy fragment wygeneruje tabelę wyników we wszystkich wyzwaniach serii.
Aby mieć pewność, że Twoje odpowiedzi się pojawią, zacznij każdą odpowiedź od nagłówka, używając następującego szablonu Markdown:
# Language Name, N bytes
gdzie N jest rozmiarem twojego zgłoszenia. Jeśli poprawisz swój wynik, możesz zachować stare wyniki w nagłówku, przekreślając je. Na przykład:
# 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
lub drugieb
” - cóż, które? Oba, czy jedno?Odpowiedzi:
CJam, 16 bajtów
Pobiera dane wejściowe na stosie jako
a b n
miejscea
ib
są podwajane. Demo onlineźródło
Dyalog APL ,
222115 bajtówBierze ( a , b ) jako właściwy argument i monituje o n :
(
+.×
iloczyn skalarny 0,5 i odpowiedni argument,
śledzony przez×.*⍨
„moc kropki” odpowiedniego argumentu i 0,5 *)⍣⎕
zastosowane czasy numeryczne.* „Moc kropkowa” jest jak iloczyn skalarny, ale z wykorzystaniem mnożenia i mocy zamiast plus i mnożenia, jak następuje:
n
A ×.*⍨ B
jest ∏ B i A = ∏ B 1 A B 2 Ai = 1
-3 bajty dzięki ngn.
Stara wersja:
Przyjmuje
n
jako lewy argument ia b
prawy argument.⊢⍵
Na RightArg(
...)⍣⍺
ponownie oblicz(+/÷≢)
sumę razy LeftArg podzieloną przez sumę,,
po której następuje.5*⍨×/
pierwiastek kwadratowy produktu.Wszystkie przypadki testowe:
źródło
f⍣⍺⊢⍵
to idiom, którego używasz profesjonalnie?Of⍣core⊢TREE
Na miserver.dyalog.com (kliknij dużą literę „D” i przewiń do wiersza [266]).TI-BASIC, 22 bajty
Robi dokładnie to, co mówi algorytm. Pobiera N z monitu, a A i B
Ans
jako listę dwuelementową.Jeśli N wynosi 0,
For(
pętla jest całkowicie pomijana.źródło
JavaScript ES7,
4843 bajtów-5 dzięki Downgoat!
Bardzo prosta funkcja rekurencyjna.
źródło
(a*b)**.5
jest krótszy niżMath.sqrt(a*b)
. przykładMATLAB / Octave,
6965 bajtówźródło
b=(a*b).^5
bezpośrednio, ponieważ nie będzieszb
ponownie używać tej iteracji i zaoszczędzisz 4 bajty.Galaretka, niekonkurująca
9 bajtów Ta odpowiedź nie jest konkurencyjna, ponieważ korzysta z funkcji, które datują wyzwanie.
Wypróbuj online!
Jak to działa
źródło
Poważnie, 11 bajtów
Hex Dump:
Wypróbuj online
Wyjaśnienie:
źródło
C ++,
108102100 bajtówDziękuję @RetoKoradi i @AlexA za uratowanie mi 6 bajtów.
Jest to niekonkurencyjne, ponieważ C ++ nie jest dobrym językiem golfowym. Zrobiłem to dla zabawy :)
Jest to prosta funkcja rekurencyjna, bardzo podobna do odpowiedzi JS.
źródło
float
zamiast zamiastdouble
jest krótsze.#include
linii.f(float*s)
który wskaźnik do 3 liczb zmiennoprzecinkowych ma być w „rozsądnym formacie”. Nie jestem pewien, czy to faktycznie skraca to.K5, 15 bajtów
Bardzo dosłownie:
W akcji:
Niestety nie działa to w OK, ponieważ ten tłumacz nie obsługuje obecnie projekcji (curry) przysłówków. Działa w prawdziwym k5.
W ok obecnie byłoby konieczne zawinięcie definicji w lambda:
źródło
J,
1813 bajtówStosowanie:
źródło
Japt , 24 bajty
25 33Zaoszczędź 9
7bajtów dzięki @ETHproductionsKorzysta z destrukcji ES6.
Wypróbuj online
Niegolfowane i objaśnienia
źródło
Uo
generuje zakres liczb od 0 do U, więcUo m@[V,W]=[V+W /2,(V*W q]
powinno działać. (NieU
innego niż 1, wysyłając każdą pętlę w miarę jej działania. Oto jeden, który działa poprawnie:Uo £[VW]=[V+W /2(V*W q]};[VW]
r
wydawało się również działaćMatlab, 54 bajty
Przykład:
źródło
Pyth, 12
Pakiet testowy
Wyjaśnienie
źródło
@
i.O
, ale nawet nie znałem nowego celuE
.Minkolang v0.14, 23 bajty
Wypróbuj tutaj !
źródło
Pyth, 15 bajtów
źródło
Python 3,
6555 bajtówDzięki Mathmandan za wskazanie krótszej wersji za pomocą
lambda
operatora.Moja oryginalna wersja:
Ku mojemu rozczarowaniu funkcja rekurencyjna (a mianowicie odpowiedzi na JavaScript i C ++) była krótsza niż prosta pętla for.
źródło
lambda
iif/else
operatora trójskładnikowego :f=lambda a,b,n:f((a+b)/2,(a*b)**.5,n-1)if n else(a,b)
R, 66 bajtów
Stosowanie:
źródło
Mathematica,
3130 bajtówOszczędność jednego bajtu dzięki Martinowi Büttnerowi.
Stosowanie:
źródło
Lua, 62 bajty
Zastosowania polecenia argumenty wiersza z
...
przypisać don
,a
ib
, fajną sztuczkę dowiedziałem się o Lua niedawno.źródło
Haskell, 40 bajtów
Anonimowa funkcja. Przykładowe użycie:
Funkcja lambda
(\(a,b)->((a+b)/2,sqrt$a*b))
przyjmuje krotkę średnią arytmetyczną i geometryczną. Jest to iterowane począwszy od pierwszego wejścia (krotki), a następnie(!!)
indeksuje drugie wejście, aby określić liczbę iteracji.źródło
Perl, 60 bajtów
NB: Według tego meta postu uważam , że mam poprawną punktację. Rzeczywisty kod (między pojedynczymi cudzysłowami) składa się z 58 znaków, a następnie dodałem +2 dla
a
ip
flagi, ponieważ jest to różnica od najkrótszego wywołania,perl -e'...'
Niejasne skargi
Mam dokuczliwe wrażenie, że brakuje mi oczywistej poprawy. Wiem, „witaj w golfa kodowania”, ale mam na myśli więcej niż zwykle. Sądzę, że istnieje łatwa okazja, aby to skrócić.
Na początku miałem problemy z używaniem
$\
jako drugiego terminu z pewnym sukcesem, ale powyższe podejście skończyło się o 2 bajty krótsze, nawet zap
wymaganymi dodatkowymi flagami. Podobnie unikanie wyraźnego$_
przypisania byłoby fajne, ale pętla utrudnia to.Te
shift@F
błędy ja też; jeśli jednak nie zrobię tego w ten sposób (lub użyję@F=(0,...,...)
zamiast tego, co nie zapisuje żadnych bajtów), przy@F
przypisaniu występuje błąd „jeden po drugim” .Przykład
Wyjścia
źródło
Julia, 49 bajtów
Całkiem bezpośredni algorytm iteracyjny. Użycie
√
symbolu i wielokrotnego powrotu pozwala zaoszczędzić kilka bajtów, ale składnia pętli for kosztuje kilka.źródło
Haskell, 47 bajtów
źródło
Julia, 42 bajty
Jest to funkcja rekurencyjna,
f
która przyjmuje trzy liczby i zwraca krotkę.Nie golfowany:
źródło
LabVIEW, 21 Prymitywów LabVIEW
Prymitywy liczone zgodnie z tym postem .
całkiem nieźle do przodu, niewiele do wyjaśnienia.
źródło
Python 2,
626162 bajtówźródło
CJam, 16 bajtów
To anonimowa funkcja. Dane wejściowe to lista z dwiema wartościami (jako liczba podwójna), po której następuje liczba iteracji. Wypróbuj online z kodem I / O do testowania.
Normalnie nie napisałbym tego, ponieważ @PeterTaylor opublikował równie długą odpowiedź CJam, zanim zobaczyłem pytanie. Ale ponieważ jest to reklamowane jako początek serii, chciałem zachować moje opcje otwarte, na wypadek gdyby seria była interesująca.
Chociaż długość jest taka sama jak odpowiedź Piotra, kod nie jest. Wybrałem inny format wejściowy, biorąc dwie wartości z listy, gdzie Peter użył osobnych wartości. Więc chociaż w obu formatach wejściowych jest niewiele, kod wygląda zupełnie inaczej.
źródło
Perl 6 ,
5347 bajtówstosowanie:
Jeśli zmienię wejście z
a,b,n
na(a,b),n
, mogę zapisać kilka bajtów.stosowanie:
Naprawdę chciałbym zamienić się z
... *
ze... -> (\a,\b) { a =~= b }
, wtedy nie byłoby potrzeby dla$^n
parametru.(nie używaj
==
zamiast=~=
, bo może się nie zatrzymać)źródło
Prolog, 80 bajtów
Kod:
Przykład:
Wypróbuj online tutaj
źródło
Java,
1039684 bajtówSprawdź wszystkie przypadki testowe.
Stara wersja (96 bajtów):
Stara wersja (103 bajty):
źródło