AGM Series Hole 1: Hitung Rata-Rata Aritmatika-Geometris


26

Pertanyaan ini terinspirasi oleh HNQ ini .

Tentang seri ini

Pertanyaan ini sekarang merupakan bagian dari seri tentang metode RUPS. Posting pertama dalam seri ini adalah tentang menghitung AGM. Anda dapat memperlakukan ini seperti tantangan golf kode lainnya, dan menjawabnya tanpa khawatir tentang seri sama sekali. Namun, ada papan peringkat di semua tantangan.

Apa Arti Aritmatika-Geometris

The Arithmetic-Mean Geometrik dari dua angka didefinisikan sebagai jumlah yang berulang kali mengambil sarana aritmatika dan geometri konvergen ke. Tugas Anda adalah menemukan nomor ini setelah beberapa kali npengulangan.

Klarifikasi

  • Anda mengambil tiga angka, a, b, ndalam format apa pun yang masuk akal.
  • Untuk niterasi, ambil aritmatika dan rata-rata geometri dari adan bdan atur ke adan b.
  • Untuk dua angka adan b, mean aritmatika didefinisikan sebagai(a + b) / 2 .
  • Mean geometrik didefinisikan sebagai √(a * b).
  • a dan b harus saling mendekati.
  • Kemudian, output keduanya adanb .
  • Anda tidak perlu khawatir tentang kesalahan mengambang dan semacamnya.
  • Ini adalah sehingga kode terpendek dalam byte menang!

Uji Kasus

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

Papan peringkat

Dicuri dari seri Martin.

Cuplikan berikut akan menghasilkan papan peringkat di semua tantangan seri.

Untuk memastikan jawaban Anda muncul, mulailah setiap jawaban dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana N adalah ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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


1
Apakah angka awal bilangan bulat positif?
xnor

2
" Keduanya aataub " —Yah, yang mana? Keduanya, atau salah satunya?
Gagang Pintu

@Doorknob -_- Keduanya.
Maltysen

1
@xnatau no. Lihatlah test case terakhir.
Maltysen

5
Membuat bagian dari seri ini menyebabkan semacam situasi yang tidak menguntungkan. Ini sangat sederhana sehingga solusi semua akan terlihat sangat mirip. Dan memposting solusi serupa dalam bahasa yang sudah digunakan umumnya disukai. Saya menulis solusi saya sekitar 2 menit, tetapi dalam bahasa yang sudah digunakan, dan itu panjang yang sama. Jika saya mengikuti etiket posting khas, saya tidak akan dapat berpartisipasi dalam seri.
Reto Koradi

Jawaban:



9

Dyalog APL , 22 21 15 byte

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

Mengambil ( a , b ) sebagai argumen yang benar, dan meminta n :

(

  +.× produk titik 0,5 dan argumen yang tepat

, diikuti oleh

  ×.*⍨"dot power" dari argumen yang tepat dan 0,5 *

)⍣⎕ diterapkan waktu numerik-cepat.

* "dot power" sama seperti dot produk, tetapi menggunakan multiplikasi dan power bukannya plus dan multiplikasi, sebagai berikut:

      n
A ×.*⍨ B adalah B i A = B 1 A B 2 A
      i = 1

-3 byte terima kasih kepada ngn.


Versi lama:

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

Dibawa nsebagai argumen kiri dana b sebagai argumen kanan.

⊢⍵Di RightArg
(... hitung )⍣⍺kembali LeftArg kali
(+/÷≢)jumlah dibagi dengan penghitungan
,diikuti oleh
.5*⍨×/ akar kuadrat dari produk.

Semua kasus uji:

      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│
└────┴─────┴────────────────┴───────────────────────┴───────────────────────┴───────────────────────┘

Apakah f⍣⍺⊢⍵atau sejenisnya idiom yang Anda gunakan secara profesional?
lirtosiast

@ThomasKwa Ya, lihat misalnya Of⍣core⊢TREEdi miserver.dyalog.com (klik "D" besar dan gulir ke baris [266]).
Adám

7

TI-BASIC, 22 byte

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

Melakukan persis apa yang dikatakan algoritma. Mengambil N dari prompt, dan A dan B melaluinya Anssebagai daftar dua elemen.

Jika N adalah 0, For(loop dilewati seluruhnya.


6

JavaScript ES7, 48 43 byte

-5 Terima kasih untuk Downgoat!

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

Fungsi rekursif yang sangat sederhana.


2
(a*b)**.5lebih pendek dari Math.sqrt(a*b). contoh
Downgoat

@Downgoat Itu ES7, tapi meh.
Conor O'Brien

6

MATLAB / Oktaf, 69 65 byte

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

1
Anda dapat melakukannya b=(a*b).^5secara langsung karena Anda tidak menggunakan bkembali dalam iterasi dan menyimpan 4 byte.
Brain Guider

6

Jelly, tidak bersaing

9 byte Jawaban ini tidak bersaing, karena menggunakan fitur yang mengeposkan tantangan.

SH;P½¥ðṛ¡

Cobalah online!

Bagaimana itu bekerja

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

Serius, 11 byte

,p`;π√@æk`n

Hex Dump:

2c70603be3fb40916b606e

Cobalah online

Penjelasan:

,                    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 byte

Terima kasih kepada @RetoKoradi dan @AlexA karena telah menyelamatkan saya 6 byte.

Ini tidak kompetitif, karena C ++ bukan bahasa golf yang baik. Melakukan ini untuk bersenang-senang :)

#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);}

Ini adalah fungsi rekursi sederhana, sangat mirip dengan jawaban JS.


3
Anda dapat menyingkirkan spasi setelah koma. Juga, menggunakan floatbukannya doublelebih pendek.
Reto Koradi

1
Anda juga dapat menghapus spasi di #includegaris.
Alex A.

Wow, aku bodoh karena tidak memperhatikan itu. Terima kasih!
TheCoffeeCup

Saya akan mempertimbangkan f(float*s)yang mengambil pointer ke 3 mengapung berada dalam "format yang masuk akal". Tidak yakin apakah itu benar-benar membuatnya lebih pendek.
nwp

4

K5, 15 byte

Sangat harfiah:

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

Beraksi:

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

Sayangnya, ini tidak berfungsi di oK karena penerjemah itu saat ini tidak mendukung proyeksi (currying) kata keterangan. Bekerja di k5 nyata.

Dalam oK, saat ini perlu untuk membungkus definisi dalam lambda:

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

4

J, 18 13 byte

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

Pemakaian:

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

Wow, ini berhasil. Konjungsi aneh. Saya berharap ungkapan ini menjadi kata keterangan (yang bisa jadi), tetapi jika disajikan dengan argumen itu juga sebuah fungsi.
randomra

3

Japt , 24 byte 25 33

Disimpan 9 7 byte, terima kasih kepada @ETHproductions

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

Mengambil keuntungan dari penghancuran ES6.

Cobalah online

Penjelasan && Tidak Terkumpul

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]

Uomenghasilkan rentang angka dari 0 hingga U, jadi Uo m@[V,W]=[V+W /2,(V*W q]seharusnya berfungsi. (Belum diuji)
ETHproduk

Oh, dan kamu tidak perlu koma sama sekali. :)
ETHproduk

@ ETHproduksi terima kasih lagi! :)
Downgoat

Oh sayang, ini gagal untuk Uselain 1, menghasilkan setiap loop saat berjalan. Inilah salah satu yang bekerja dengan baik:Uo £[VW]=[V+W /2(V*W q]};[VW]
ETHproduk

@ ETHproduk terima kasih, tetapi menggunakan rtampaknya berfungsi juga
Downgoat

3

Matlab, 54 byte

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

Contoh:

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

3

Pyth, 12

u,.OG@*FG2EQ

Test Suite

Penjelasan

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

Lupa tentang @dan .O, tetapi saya bahkan tidak tahu tujuan baru dari E.
orlp

@ Atau ah, tidak melihat posting Anda, saya buruk saya hanya akan menyarankan ini di komentar. Dan ya, melacak semua hal yang berubah adalah sedikit perjuangan: P
FryAmTheEggman

2

Minkolang v0.14, 23 byte

Coba di sini !

$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 byte

Berkat mathmandan untuk menunjukkan versi yang lebih pendek menggunakan lambdaoperator

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

Versi asli saya:

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

Untuk kecewa saya, fungsi rekursif (ala JavaScript dan C ++ jawaban) lebih pendek daripada sederhana untuk loop.


2
Anda dapat mempersingkat ini dengan lambdadan if/elseoperator ternary :f=lambda a,b,n:f((a+b)/2,(a*b)**.5,n-1)if n else(a,b)
mathmandan

Tidak masalah! (Juga, saya pikir ini adalah 53 byte.)
mathmandan

File .py yang saya simpan terdaftar sebagai 55 byte. Apakah ada cara yang lebih baik untuk menghitung ukuran program?
Jack Brounstein

Terkadang orang di situs ini menyalin dan menempelkan kode mereka ke mothereff.in/byte-counter . Jika Anda bertanya-tanya tentang perbedaan ini, saya kira Windows memasukkan karakter baris baru yang tidak perlu di akhir file .py Anda (dan Windows menghitung baris baru sebagai 2 byte, bukan 1). Apa pun itu, Anda tidak harus menghitung baris terakhir sebagai bagian dari kode Anda untuk tujuan penilaian. Jika Anda memposting entri beberapa baris, Anda harus menghitung 1 untuk setiap karakter baris baru, bukan 2, dan tidak termasuk baris baru di akhir baris kode terakhir Anda. (Sejauh yang saya mengerti aturannya sih!)
mathmandan

2

R, 66 byte

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

Pemakaian:

> 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

Anda dapat menghapus nama fungsi untuk menyimpan 2 byte.
Alex A.

2

Mathematica, 31 30 byte

Disimpan satu byte berkat Martin Büttner.

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

Pemakaian:

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

Out[1]= {13.4582, 13.4582}

1

Lua, 62 byte

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

Menggunakan argumen baris perintah dari ...untuk ditugaskan n, adan b, trik bagus yang saya pelajari tentang Lua baru-baru ini.


1

Haskell, 40 byte

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

Fungsi anonim. Contoh penggunaan:

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

Fungsi lambda (\(a,b)->((a+b)/2,sqrt$a*b))mengambil aritmatika dan rata-rata geometrik pada tupel. Ini diulang mulai dengan input pertama (tuple), dan kemudian (!!)indeks input kedua untuk menentukan jumlah iterasi.


1

Perl, 60 byte

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

NB: Per postingan meta ini , saya yakin skor saya sudah benar. Kode aktual (antara tanda kutip tunggal) adalah 58 karakter, kemudian saya menambahkan +2 untuk adanp menandai karena itulah perbedaan dari doa terpendek,perl -e'...'

Keluhan yang tidak jelas

Saya punya perasaan mengomel ini, saya kehilangan perbaikan yang jelas. Saya tahu, "selamat datang di kode golf", tapi maksud saya lebih dari biasanya saya percaya ada peluang mudah untuk mempersingkat ini.

Awalnya, saya telah mengacaukan penggunaan $\sebagai istilah kedua dengan beberapa keberhasilan, tetapi pendekatan di atas akhirnya menjadi 2 byte lebih pendek, bahkan dengan apbendera tambahan yang diperlukan. Demikian pula, menghindari yang eksplisit$_ penugasan akan menyenangkan, tetapi pengulangan mempersulitnya.

The shift@Fmengganggu saya, juga; jika saya tidak melakukannya dengan cara itu (atau menggunakannya @F=(0,...,...)sebagai gantinya, yang tidak menyimpan byte), ada kesalahan off-by-one dengan@F tugas tersebut.

Contoh

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

Keluaran

13.4581714817256 13.4581714817256

1

Julia, 49 byte

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

Algoritma iteratif yang cukup langsung. Menggunakan simbol dan multiple return menghemat beberapa byte, tetapi sintaks for loop membutuhkan beberapa byte.


1

Haskell, 47 Bytes

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

Anda dapat menyimpan beberapa byte dengan ab sebagai pasangan dalam f: fx 0 = x; f (a, b) n = f ((a + b) / 2, sqrt $ a * b) $ n-1
Damien

Dan tentukan fungsi infix.
xnor

1

Julia, 42 byte

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

Ini adalah fungsi rekursif fyang menerima tiga angka dan mengembalikan tuple.

Tidak Disatukan:

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 Primitif

Primitif dihitung sesuai meta post ini .

cukup teguh untuk tidak banyak menjelaskan.


1

Python 2, 62 61 62 byte

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

3
Program hanya boleh mencetak sekali, saat berakhir.
lirtosiast

1
Kesalahpahaman saya. Tetap.
wflynny

1

CJam, 16 byte

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

Ini adalah fungsi anonim. Input adalah daftar dengan dua nilai (sebagai ganda), diikuti oleh jumlah iterasi. Cobalah online dengan kode I / O untuk pengujian.

Saya biasanya tidak memposting ini karena @PeterTaylor memposting jawaban CJam yang sama panjang sebelum saya melihat pertanyaan. Tapi karena ini diiklankan sebagai awal dari sebuah seri, saya ingin tetap membuka opsi saya jika seri ini menarik.

Meskipun panjangnya sama dengan jawaban Peter, kodenya tidak. Saya memilih format input yang berbeda dengan mengambil dua nilai dalam daftar, di mana Peter menggunakan nilai yang terpisah. Jadi sementara tidak banyak dengan format input, kode terlihat sangat berbeda.

{     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 byte

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

pemakaian:

# 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)

Jika saya mengubah input dari a,b,nmenjadi (a,b),nsaya dapat menyimpan beberapa byte.

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

pemakaian:

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
}

Sungguh saya akan menukar ... *dengan ... -> (\a,\b) { a =~= b }, maka tidak perlu untuk $^nparameter.
(jangan gunakan ==sebagai gantinya =~=, atau mungkin tidak berhenti)

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 byte

Kode:

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).

Contoh:

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

Cobalah online di sini


0

Java, 103 96 84 byte

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

Verifikasi semua testcases.

Versi lama (96 byte):

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;}

Versi lama (103 byte):

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;}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.