AGM Serisi Delik 1: Aritmetik – Geometrik Ortalamayı Hesapla


26

Bu soru bu HNQ'dan ilham almıştır .

Dizi hakkında

Bu soru şimdi AGM metodu ile ilgili bir serinin parçası. Serinin bu ilk yazı aslında hesaplanması ile ilgili olacak AGM. Buna diğer kod golf mücadelesi gibi davranabilir ve seri hakkında endişelenmeden cevap verebilirsiniz. Ancak, tüm zorlukların karşısında bir lider tabelası var.

Aritmetik-Geometrik Ortalama Nedir?

Aritmetik Geometrik Ortalama iki sayıdan sürekli aritmetik geometrik ortalama yakınlaşıyor alma sayısı olarak tanımlanır. Göreviniz bu numarayı bazı nyinelemelerden sonra bulmak .

Açıklamalar

  • a, b, nHerhangi bir makul formatta üç numara alırsınız .
  • İçin ntekrarlamalar, aritmetik ve geometrik ortalamasını almak ave bve bu set ave b.
  • İki sayı için ave baritmetik ortalama olarak tanımlanır (a + b) / 2.
  • Geometrik ortalama, olarak tanımlanır √(a * b).
  • ave bbirbirlerine yaklaşıyor olmalılar.
  • Sonra, çıkış hem ave b.
  • Şamandıra düzensizliği konusunda endişelenmenize gerek yok.
  • Bu yani bayt cinsinden en kısa kod kazanır!

Test Kılıfları

[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]

Liderler Sıralaması

Martin serisinden çalındı.

Aşağıdaki kod parçası, dizinin tüm zorluklarına karşı bir liderlik tablosu oluşturacaktır.

Cevaplarınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak her bir başlığa başlıkla başlayın:

# Language Name, N bytes

N, gönderiminizin büyüklüğüdür. Puanınızı yükseltirseniz, başlıkları üstüne vurarak eski skorları başlıkta tutabilirsiniz. Örneğin:

# Ruby, <s>104</s> <s>101</s> 96 bytes


1
İlk sayılar pozitif tamsayılar mı?
xnor

2
" her ikisi de amib " - hangisi? İkisi ya da ikisinden biri mi?
Doorknob

@Doorknob -_- Her ikisi de.
Maltysen

1
@ xnor no. Son test olayına bak.
Maltysen

5
Bir serinin bu bölümünü yapmak, bir tür talihsiz duruma neden olur. Bu o kadar basit ki, çözümlerin hepsi birbirine benzeyecek. Ve halihazırda kullanılmış olan dillerde benzer çözümler göndermek genellikle kaşlarını çattı. Çözümümü yaklaşık 2 dakika içinde yazdım, ancak daha önce kullanılmış bir dilde ve aynı uzunlukta. Tipik kayıt kurallarına uyursam, diziye katılamayacağım.
Reto Koradi

Yanıtlar:



9

Dyalog APL , 22 21 15 bayt

.5∘(+.×,×.*⍨)⍣⎕

( A , b ) 'yi doğru argüman olarak alır ve n'yi ister :

(

  +.× 0.5 nokta çarpımı ve doğru argüman

, bunu takiben

  ×.*⍨Doğru argümanın "nokta gücü" ve 0.5 *

)⍣⎕ sayısal bilgi istemi süreleri uygulandı.

* "nokta gücü" nokta ürünü gibidir, ancak artı ve çarpma yerine çarpma ve güç kullanma:

      n
A ×.*⍨ B , B i A = B 1 A B 2 A
      i = 1'dir

Ngn sayesinde -3 bayt.


Eski versiyon:

{((+/÷≢),.5*⍨×/)⍣⍺⊢⍵}

Alır nsol argüman olarak ve a bsağ argüman olarak.

⊢⍵RightArg'da
(... )⍣⍺LeftArg çarpı
(+/÷≢)toplamını hesaplar ve
,bunu
.5*⍨×/ürünün karesi takip eder.

Tüm test durumları:

      f←{((.5×+/),.5*⍨×/)⍣⍺⊢⍵}
      0 1 2 5 10 10 f¨ (24 6)(24 6)(24 6)(24 6)(100 50)(1,2*.5)
┌────┬─────┬────────────────┬───────────────────────┬───────────────────────┬───────────────────────┐
│24 6│15 12│13.5 13.41640786│13.45817148 13.45817148│72.83955155 72.83955155│1.198140235 1.198140235│
└────┴─────┴────────────────┴───────────────────────┴───────────────────────┴───────────────────────┘

f⍣⍺⊢⍵veya benzer bir deyim sen profesyonel kullanılır?
lirtosiast

@ThomasKwa Evet, mesela bakınız Of⍣core⊢TREEde miserver.dyalog.com (hattına büyük "D" ve kaydırma tıklayın [266]).
19’da:

7

TI-BASIC, 22 bayt

Input N
For(I,1,N
{mean(Ans),√(prod(Ans
End
Ans

Algoritmanın söylediklerini tam olarak yapar. İstemi N, A ve B ise Ansiki elemanlı bir liste halinde alır.

N, 0 ise, For(döngü tamamen atlanır.


6

JavaScript ES7, 48 43 bayt

-5 Downgoat'a teşekkürler!

f=(n,a,b)=>n?f(n-1,(a+b)/2,(a*b)**.5):[a,b]

Çok basit özyinelemeli işlevi.


2
(a*b)**.5daha kısa Math.sqrt(a*b). örnek
Downgoat

@Downgoat Bu ES7, ama meh.
Conor O'Brien,

6

MATLAB / Octave, 69 65 bayt

function [a,b]=r(a,b,n)
for i=1:n;j=(a+b)/2;b=(a*b)^.5;a=j;end

1
Bu yinelemede tekrar b=(a*b).^5kullanmadığınız için doğrudan yapabilir bve 4 bayt tasarruf edebilirsiniz.
Brain Guider

6

Jöle, rakipsiz

9 bytes Bu cevap rakipsizdir, çünkü mücadeleyi önleyen özellikleri kullanır.

SH;P½¥ðṛ¡

Çevrimiçi deneyin!

Nasıl çalışır

SH;P½¥ðṛ¡    Input: x (vector) -- y (repetitions)

SH           Take the sum (S) of x and halve (H) the result.
   P½        Take the product (P) of x and the square root (½) of the result.
     ¥       Combine the last two instructions in a dyadic chain.
  ;          Concatenate the results to the left and to the right.
      ð      Push the preceding, variadic chain; begin a new, dyadic chain.
       ṛ     Return the right argument (y).
        ¡    Repeat the pushed chain y times.

5

Cidden, 11 bayt

,p`;π√@æk`n

Hex Dump:

2c70603be3fb40916b606e

Çevrimiçi deneyin

Açıklama:

,                    Read in the list as [n,a,b]
 p                   pop list to yield: n [a,b]
  `      `n          Push a quoted function and run it n times.
   ;                 Duplicate [a,b] pair
    π√               Compute its product and square root it (GM)
      @              Swap the other copy of the pair to the top
       æ             Compute its mean.
        k            Compile the stack back into a list.

5

C ++, 108 102 100 bayt

Bana 6 byte kaydettiğin için @RetoKoradi ve @AlexA'ya teşekkür ederim.

Bu rekabetçi değildir, çünkü C ++ iyi bir golf dili değildir. Eğlenmek için yaptım :)

#include<cmath>
std::string f(float a,float b,int n){return n==0?a+" "+b:f((a+b)/2,sqrt(a*b),n-1);}

Bu, JS cevabına çok benzeyen basit bir özyineleme işlevidir.


3
Virgüllerden sonra boşluklardan kurtulabilirsin. Ayrıca, floatbunun yerine kullanmak doubledaha kısadır.
Reto Koradi

1
Satırdaki boşluğu da kaldırabilirsiniz #include.
Alex A.

Vay, bunu fark etmemek için aptalım. Teşekkürler!
TheCoffeeCup

f(float*s)Hangi işaretleyicinin 3 kayan noktaya “makul bir formatta” geldiğini düşünebilirim . Bunun gerçekten daha kısa olmasını sağladığından emin değilim.
nwp

4

K5, 15 bayt

Çok değişmez:

{(+/x%2;%*/x)}/

Eylemde:

 {(+/x%2;%*/x)}/[0; 24 6]
24 6
 {(+/x%2;%*/x)}/[5; 24 6]
1.345817e1 1.345817e1

Ne yazık ki, bu OK'de çalışmaz çünkü bu tercüman şu anda zarfların yansıtılmasını (körelme) desteklememektedir. Gerçek k5'te çalışır.

OK'de, tanımın bir lambdaya sarılması şu anda gerekli olacaktır:

  {x{(+/x%2;%*/x)}/y}[5; 24 6]
13.4582 13.4582

4

J, 18 13 bayt

-:@+/,%:@*/^:

Kullanımı:

   agm =: -:@+/,%:@*/^:
   5 agm 24 6
13.4582 13.4582

Vay, bu işe yarıyor. Bağlaçlar garip. Bu ifadenin bir zarf olmasını beklerdim (ki olabilir), ancak argümanlarla sunulmuşsa, aynı zamanda bir fonksiyondur.
15'te randomra

3

Japt , 24 bayt 25 33

9 7 bayt kaydedildi @ETHproductions

Uo r@[VW]=[V+W /2(V*W q]

ES6 yok etmeden faydalanır.

Çevrimiçi deneyin

Ungolfed ve Açıklama

Uo r@[VW]=[V+W /2(V*W q]

       // Implicit: U: 1st input, V: 2nd input, W: 3rd input
Uo     // Range from 0 to 1st input
r@     // Loop over range
  [V,W]=    // Set 2nd and 3rd input to...
   [V+W /2,   // Add 2nd and 3rd inputs, divide by 2
   (V*W q]    // Multiple 2nd and 3rd inputs, find square root
            // Set's to the above respectively 
       // Implicit: return [V,W]

Uo0'dan U'ya kadar bir sayı aralığı oluşturur, bu nedenle Uo m@[V,W]=[V+W /2,(V*W q]çalışması gerekir. (
Denenmemiş

Oh, ve virgüllere hiç ihtiyacın olmamalı. :)
ETH Sunumları

@ETHproductions yine teşekkürler! :)
15:15

Ah canım, bu U1'den başka herhangi bir şey için başarısız olur , her döngüyü devam ederken verir. İşte düzgün çalışan biri:Uo £[VW]=[V+W /2(V*W q]};[VW]
ETHproductions 9'15

@ETHproductions teşekkürler, ancak kullanarak rda çalışmak gibiydi
Downgoat

3

Matlab, 54 bayt

function x=f(x,n)
for k=1:n
x=[mean(x) prod(x)^.5];end

Örnek:

>> f([24 6], 2)
ans =
  13.500000000000000  13.416407864998739

3

Pyth, 12

u,.OG@*FG2EQ

Test odası

açıklama

u,.OG@*FG2EQ    ##  implicit: Q = eval(input())
u         EQ    ##  reduce eval(input()) times, starting with Q
                ##  the reduce lambda has G as the previous value and H as the next
  .OG           ##  arithmetic mean of last pair
     @*FG2      ##  geometric mean of last pair, uses *F to get the product of the list
                ##  and @...2 to get the square root of that
 ,              ##  join the two means into a two element list

Unuttum @ve .O, ama yeni amacını bile bilmiyordum E.
orlp

@ orlp ah, postanızı görmedim, kötü, yorumlarda bunları önerirdim Ve evet, değişen şeyleri takip etmek biraz
zor bir iştir

2

Minkolang v0.14, 23 bayt

Burada dene !

$n[$d+2$:r*1Mi2%?!r]$N.
$n                      C get all input C
  [                ]    C pop N; repeat inner N times C
   $d                   C duplicate stack [1,2] => [1,2,1,2] C
     +                  C add top two elements C
      2$:               C divide by two C
         r              C reverse stack (get the other two) C
          *             C multiply them together C
           1M           C take square root C
             i2%?!r     C reverse the stack if an odd step number C
                    $N  C output stack
           1M           C take square root C
             i          C get step in for loop C


2

Python 3, 65 55 bayt

lambdaOperatörü kullanarak daha kısa bir versiyona işaret eden mathmandan sayesinde .

f=lambda a,b,n:f((a+b)/2,(a*b)**.5,n-1)if n else(a,b)

Orijinal sürümüm:

def f(a,b,n):
 if n:f((a+b)/2,(a*b)**.5,n-1)
 else:print(a,b)

Chagrin için özyinelemeli bir işlev (JavaScript ve C ++ cevapları) döngü için basitten daha kısaydı.


2
Bunu biraz lambdave üçlü if/elseoperatörle kısaltabilirsiniz :f=lambda a,b,n:f((a+b)/2,(a*b)**.5,n-1)if n else(a,b)
mathmandan

Sorun değil! (Ayrıca, bu 53 bayt olduğunu düşünüyorum.)
mathmandan

Kaydettiğim .py dosyası 55 bayt olarak listeleniyor. Program boyutunu hesaplamanın daha iyi bir yolu var mı?
Jack Brounstein

Bazen bu sitedeki insanlar kodlarını kopyalayıp mothereff.in/byte-counter dosyasına yapıştırırlar . Tutarsızlık hakkında merak ediyorsanız, Windows'un .py dosyanızın sonuna gereksiz bir yeni satır karakteri eklediğini tahmin ediyorum (ve Windows 1 yerine 2 bayt olarak yeni bir satır sayıyor). Her iki durumda da, bu son yeni satırı puanlama amaçlı kodunuzun bir parçası olarak saymanız gerekmez. Çok satırlı bir giriş yaparsanız, her yeni satır karakteri için 1 değil, son kod satırınızın sonuna herhangi bir satırsonu eklememelisiniz. (Zaten kuralları anladığım kadarıyla!)
mathmandan

2

R, 66 bayt

f=function(a,b,n){while(n){x=(a+b)/2;b=(a*b)^.5;n=n-1;a=x};c(a,b)}

Kullanımı:

> f(24,6,0)
[1] 24  6
> f(24,6,1)
[1] 15 12
> f(24,6,2)
[1] 13.50000 13.41641
> f(24,6,3)
[1] 13.45820 13.45814
> f(24,6,4)
[1] 13.45817 13.45817
> f(100,50,10)
[1] 72.83955 72.83955
> f(1,1.41421356237,10)
[1] 1.19814 1.19814

2 bayt kaydetmek için işlev adını kaldırabilirsiniz.
Alex A.

2

Mathematica, 31 30 bayt

Martin Büttner sayesinde bir bayt kurtarıldı.

{+##/2,(1##)^.5}&@@#&~Nest~##&

Kullanımı:

In[1]:= {+##/2,(1##)^.5}&@@#&~Nest~##&[{24, 6}, 5]

Out[1]= {13.4582, 13.4582}

1

Lua, 62 bayt

n,a,b=...for i=1,n do a,b=(a+b)/2,math.sqrt(a*b)end print(a,b)

Kullanımları satır argümanları komut ...atamak n, ave b, son zamanlarda Lua öğrendim şık hile.


1

Haskell, 40 bayt

(!!).iterate(\(a,b)->((a+b)/2,sqrt$a*b))

Anonim bir işlev. Örnek kullanım:

>> let f=(!!).iterate(\(a,b)->((a+b)/2,sqrt$a*b)) in f (1.0,1.41421356237) 10
(1.198140234734168,1.1981402347341683)

Lambda işlevi (\(a,b)->((a+b)/2,sqrt$a*b)), bir tuple üzerinde aritmetik ve geometrik ortalamayı alır. Bu, ilk girişten başlayarak yinelenir (bir demet) ve sonra (!!)yinelemelerin sayısını belirtmek için ikinci girişi dizine alır.


1

Perl, 60 bayt

perl -ape'F=($F[0]/2+$F[1]/2,sqrt$F[0]*$F[1])for 1..shift@F;$_="@F"'

Not: Başına Bu meta yazı , ben inanıyorum ben puanlama doğru var. Gerçek kod (tek tırnaklar arasında) 58 karakter, sonra +2 ekledim ave pbayraklar en kısa çağrıdan farkı olarak işaretler,perl -e'...'

Belirsiz şikayetler

Bu dırdırcı hislerim var, bariz bir iyileşme eksik. Biliyorum, "golf oynamaya hoş geldiniz", ama her zamankinden daha fazla demek istiyorum ki, bunu kısaltmak için kolay bir fırsat olduğuna inanıyorum.

İlk başlarda $\, ikinci terim olarak bir miktar başarı ile kullanmaya başladım , ancak yukarıdaki yaklaşım apgerekli ekstra bayraklarla bile 2 bayt daha kısa oldu . Benzer şekilde, açıkça yapılan $_ödevlerden kaçınmak iyi olurdu, ancak döngü bunu zorlaştırıyor.

shift@FBöcek beni de; bu şekilde yapmazsam (veya @F=(0,...,...)yerine, herhangi bir bayt kaydetmez), @Fatama ile birer birer hata var .

Örnek

echo 5 24 6 | perl -ape'F=($F[0]/2+$F[1]/2,sqrt$F[0]*$F[1])for 1..shift@F;$_="@F"'

çıktılar

13.4581714817256 13.4581714817256

1

Julia, 49 bayt

(a,b,n)->(for i=1:n;a,b=(a+b)/2,√(a*b)end;(a,b))

Oldukça doğrudan yinelemeli algoritma. Sembolü ve çoklu dönüşü kullanmak birkaç bayttan tasarruf sağlar, ancak for loop sözdizimi birkaç ücrete mal olur.


1

Haskell, 47 Bayt

f a b 0=(a,b)
f a b n=f((a+b)/2)(sqrt$a*b)(n-1)

ab olarak çift alarak bazı baytları kaydedebilirsiniz: fx 0 = x; f (a, b) n = f ((a + b) / 2, sqrt $ a * b) $ n-1
Damien

Ve fonksiyon ekini tanımlayın.
xnor

1

Julia, 42 bayt

f(a,b,n)=n>0?f((a+b)/2,(a*b)^.5,n-1):(a,b)

Bu, füç sayı kabul eden ve bir tuple döndüren özyinelemeli bir işlevdir .

Ungolfed:

function f(a::Real, b::Real, n::Integer)
    if n > 0
        # Recurse on the arithmetic and geometric means, decrementing n
        return f((a + b) / 2, sqrt(a * b), n - 1)
    else
        # Return the pair
        return (a, b)
    end
end

1

LabVIEW, 21 LabVIEW İlkelleri

İlkel yazılar bu yazıya göre sayıldı .

açıklamak için oldukça staightforward çok değil.


1

Python 2, 62 61 62 bayt

def f(a,b,n):
 while n:a,b=(a+b)/2.,(a*b)**.5;n-=1
 print a,b

3
Program sonlandırıldığında yalnızca bir kez yazdırmalıdır.
lirtosiast

1
Benim yanlış anlama. Sabit.
wflynny

1

CJam, 16 bayt

{{_:+2/\:*mq]}*}

Bu anonim bir işlevdir. Girdi, iki değer içeren bir listedir (iki katına çıkar) ve ardından yineleme sayımı. Test için I / O koduyla çevrimiçi olarak deneyin .

Bunu normalde göndermezdim çünkü @PeterTaylor soruyu görmeden önce eşit derecede uzun bir CJam cevabı gönderdi. Ancak bu, bir dizinin başlangıcı olarak bildirildiği için, dizinin ilginç olması durumunda seçeneklerimi açık tutmak istedim.

Uzunluk Peter'ın cevabı ile aynı olmasına rağmen, kod değildir. Peter'ın ayrı değerler kullandığı bir listedeki iki değeri alarak farklı bir giriş formatı seçtim. Her iki giriş biçiminde de pek bir şey olmamakla birlikte, kod oldukça farklı görünüyor.

{     Start loop over number of iterations.
  _     Copy the current pair of values.
  :+    Reduce pair with + operator.
  2/    Divide by 2.
  \     Swap second copy of pair to top.
  :*    Reduce pair with * operator.
  mq    Calculate square root.
  ]     Wrap the two new values in a list for next iteration.
}*    End iteration loop.

0

Perl 6 ,  53  47 bayt

{(($^a,$^b),->(\a,\b){((a+b)/2,sqrt(a*b))}...*)[$^n]} # 53 bytes

kullanımı:

# give it a name
my &code = {(($^a,$^b),->(\a,\b){((a+b)/2,sqrt(a*b))}...*)[$^n]}

say code 100,50,10;          # (72.8395515523453 72.8395515523453)
say code 1,1.41421356237,10; # (1.19814023473417 1.19814023473417)

Ben girdi değiştirirseniz a,b,niçin (a,b),nbir kaç bayt kaydedebilirsiniz.

{($^l,->(\a,\b){((a+b)/2,sqrt(a*b))}...*)[$^n]} # 47 bytes

kullanımı:

my &code = {($^l,->(\a,\b){((a+b)/2,sqrt(a*b))}...*)[$^n]}

say code (100,50),10;          # (72.8395515523453 72.8395515523453)
say code (1,1.41421356237),10; # (1.19814023473417 1.19814023473417)

say code (24,6),$_ for 0,1,2,5;
# (24 6)
# (15 12)
# (13.5 13.4164078649987)
# (13.4581714817256 13.4581714817256)
{
  (
    $^l,          # first 2 element tuple
    ->            # pointy block (lambda)
      (\a,\b)     # take a single tuple, and give its 2 elements each a name
    {
      (           # create a 2 element tuple
        (a+b)/2,  # arithmetic mean
        sqrt(a*b) # geometric mean
      )
    } ... *       # create a lazy infinite sequence of tuples
  )[ $^n ]        # take the nth "tuple" from the outer sequence
}

Gerçekten ... *ile ile takas ediyorum ... -> (\a,\b) { a =~= b }, sonra $^nparametre için gerek olmayacaktı .
( ==yerine kullanmayın =~=, durmayabilir)

my &code = {($^l,->(\a,\b){((a+b)/2,sqrt(a*b))}...->(\a,\b){a=~=b})[*-1]}

say code (24,6);           # (13.4581714817256 13.4581714817256)
say code (100,50);         # (72.8395515523453 72.8395515523453)
say code (1,1.41421356237) # (1.19814023473417 1.19814023473417)

0

Prolog, 80 bayt

Kod:

p(A,B,0):-write([A,B]).
p(A,B,N):-X is(A+B)/2,Y is sqrt(A*B),M is N-1,p(X,Y,M).

Örnek:

p(100,50,10).
[72.83955155234534, 72.83955155234534]

Burada çevrimiçi deneyin


0

Java, 103 96 84 bayt

String f(int n,double a,double b){return n>0?f(n-1,(a+b)/2,Math.sqrt(a*b)):a+","+b;}

Tüm test durumlarını doğrulayın.

Eski versiyon (96 bayt):

String f(int n,double a,double b){for(;n>0;a=(a+b)/2,b=Math.sqrt((b-2*a)*b))n--;return a+","+b;}

Eski versiyon (103 bayt):

String f(int n,double a,double b){double t;for(;n>0;t=(a+b)/2,b=Math.sqrt(a*b),a=t)n--;return a+","+b;}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.