AGM ซีรีย์รู 1: คำนวณค่าเฉลี่ยเลขคณิตและเรขาคณิต


26

คำถามนี้ได้รับแรงบันดาลใจจากHNQนี้

เกี่ยวกับซีรี่ส์

คำถามนี้เป็นส่วนหนึ่งของชุดเกี่ยวกับวิธีการประชุมผู้ถือหุ้น AGMโพสต์นี้เป็นครั้งแรกในซีรีส์จะเป็นจริงเกี่ยวกับการคำนวณ คุณอาจปฏิบัติเช่นนี้เหมือนกับการแข่งขันกอล์ฟอื่น ๆ และตอบคำถามโดยไม่ต้องกังวลกับซีรีย์เลย อย่างไรก็ตามมีลีดเดอร์บอร์ดสำหรับทุกความท้าทาย

Arithmetic – Geometric Mean คืออะไร

Arithmetic Mean-เรขาคณิตของตัวเลขสองถูกกำหนดให้เป็นหมายเลขที่ซ้ำ ๆ การหาค่ามัชฌิมเลขคณิตและเรขาคณิตลู่ไป งานของคุณคือค้นหาหมายเลขนี้หลังจากnทำซ้ำ

ชี้แจง

  • คุณใช้ตัวเลขสามตัวa, b, nในรูปแบบที่สมเหตุสมผล
  • สำหรับnการทำซ้ำใช้มัชฌิมเลขคณิตและเรขาคณิตของaและbและการตั้งค่าเหล่านั้นไปและab
  • สำหรับตัวเลขสองaและค่าเฉลี่ยเลขคณิตถูกกำหนดให้เป็นb(a + b) / 2
  • √(a * b)ค่าเฉลี่ยเรขาคณิตถูกกำหนดให้เป็น
  • aและbควรจะเข้าหากัน
  • จากนั้นการส่งออกทั้งในและab
  • คุณไม่ต้องกังวลกับความไม่แน่นอนของการลอยตัวและเช่นนั้น
  • นี่คือสั้นที่สุดในหน่วยไบต์ !

กรณีทดสอบ

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

ลีดเดอร์บอร์ด

ขโมยมาจากซีรี่ส์ของ Martin

ตัวอย่างต่อไปนี้จะสร้างกระดานผู้นำสำหรับทุกความท้าทายของซีรี่ส์

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มต้นทุกคำตอบด้วยบรรทัดแรกโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

โดยที่ N คือขนาดของการส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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


1
ตัวเลขเริ่มต้นเป็นจำนวนเต็มบวกหรือไม่
xnor

2
" ทั้งคู่aหรือb " - ไหนดี? ทั้งสองหรืออย่างใดอย่างหนึ่ง?
Doorknob

@Doorknob -_- มันทั้งคู่
Maltysen

1
@ xnor ไม่มี ดูกรณีทดสอบสุดท้าย
Maltysen

5
การทำให้เป็นส่วนหนึ่งของซีรี่ส์นี้ทำให้เกิดสถานการณ์ที่โชคร้าย มันง่ายมากที่วิธีแก้ปัญหาทั้งหมดจะดูคล้ายกันมาก และการโพสต์วิธีแก้ปัญหาที่คล้ายกันในภาษาที่ใช้แล้วโดยทั่วไปจะขมวดคิ้วอยู่ ฉันเขียนวิธีแก้ปัญหาของฉันในเวลาประมาณ 2 นาที แต่เป็นภาษาที่ใช้แล้วและมีความยาวเท่ากัน หากฉันทำตามมารยาทการโพสต์ทั่วไปฉันจะไม่สามารถมีส่วนร่วมในซีรีส์
Reto Koradi

คำตอบ:



9

Dyalog APL , 22 21 15 ไบต์

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

ใช้เวลา ( a , b ) เป็นอาร์กิวเมนต์ที่ถูกต้องและแจ้งให้n :

(

  +.× จุดผลิตภัณฑ์ 0.5 และอาร์กิวเมนต์ที่ถูกต้อง

, ติดตามโดย

  ×.*⍨"dot dot" ของอาร์กิวเมนต์ที่ถูกต้องและ 0.5 *

)⍣⎕ ใช้จำนวนครั้งที่แจ้งให้

* "dot power" เป็นเหมือน dot dot แต่ใช้การคูณและพลังงานแทนการบวกและการคูณดังนี้

      n
A ×.*⍨ Bคือ B i A = B 1 A B 2 A
      i = 1

-3 ไบต์ด้วย ngn


เวอร์ชั่นเก่า:

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

ใช้nอาร์กิวเมนต์ซ้ายและa bอาร์กิวเมนต์ขวา

⊢⍵ใน RightArg
(... )⍣⍺คำนวณจำนวน LeftArg อีกครั้ง
(+/÷≢)หารด้วย tally
,ตามด้วยส
.5*⍨×/แควร์รูทของผลิตภัณฑ์

ทุกกรณีทดสอบ:

      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⍣⍺⊢⍵หรือคล้ายกันสำนวนคุณใช้มืออาชีพ?
lirtosiast

@ThomasKwa ใช่เห็นเช่นOf⍣core⊢TREEที่miserver.dyalog.com (คลิกใหญ่ "D" และเลื่อนไปยังบรรทัด [266])
อดัม

7

TI-BASIC, 22 ไบต์

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

ทำตามที่อัลกอริทึมพูดหรือไม่ รับ N จากพรอมต์และ A และ B Ansเป็นรายการสององค์ประกอบ

ถ้า N เป็น 0 การFor(วนซ้ำจะถูกข้ามทั้งหมด



6

MATLAB / Octave, 69 65 ไบต์

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

1
คุณสามารถทำได้b=(a*b).^5โดยตรงเนื่องจากคุณไม่ได้ใช้ซ้ำbอีกในการทำซ้ำนั้นและบันทึก 4 ไบต์
Brain Guider

6

เยลลี่ไม่ใช่การแข่งขัน

9 ไบต์ คำตอบนี้ไม่ใช่การแข่งขันเนื่องจากจะใช้คุณสมบัติที่โพสต์วันที่ท้าทาย

SH;P½¥ðṛ¡

ลองออนไลน์!

มันทำงานอย่างไร

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

จริงจัง 11 ไบต์

,p`;π√@æk`n

ฐานสิบหก:

2c70603be3fb40916b606e

ลองออนไลน์

คำอธิบาย:

,                    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 ไบต์

ขอบคุณ @RetoKoradi และ @AlexA ที่ช่วยฉัน 6 ไบต์

นี่ไม่ใช่การแข่งขันเนื่องจาก C ++ ไม่ใช่ภาษากอล์ฟที่ดี ทำเพื่อความสนุก :)

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

นี่เป็นฟังก์ชั่นการเรียกซ้ำแบบง่ายคล้ายกับคำตอบ JS


3
คุณสามารถกำจัดช่องว่างหลังเครื่องหมายจุลภาค นอกจากนี้การใช้floatแทนdoubleจะสั้นกว่า
Reto Koradi

1
นอกจากนี้คุณยังสามารถลบพื้นที่ใน#includeบรรทัด
Alex A.

ว้าวฉันงี่เง่าที่จะไม่สังเกตเห็นว่า ขอบคุณ!
TheCoffeeCup

ฉันจะพิจารณาว่าf(float*s)จะใช้ตัวชี้ใดถึง 3 ลอยอยู่ใน "รูปแบบที่สมเหตุสมผล" ไม่แน่ใจว่าจริงหรือไม่ที่ทำให้สั้นลง
nwp

4

K5, 15 ไบต์

ตัวอักษรมาก:

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

ในการดำเนินการ:

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

น่าเสียดายที่นี่ใช้งานไม่ได้ใน oK เพราะล่ามนั้นไม่สนับสนุนการฉายภาพ (คำกริยา) ของคำวิเศษณ์ ใช้งานได้จริงใน k5

ใน oK ปัจจุบันจำเป็นต้องห่อนิยามในแลมบ์ดา:

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

4

J, 18 13 ไบต์

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

การใช้งาน:

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

ว้าวมันใช้งานได้ดี คำสันธานแปลก ฉันคาดหวังว่าการแสดงออกนี้จะเป็นคำวิเศษณ์ (ซึ่งอาจเป็น) แต่ถ้านำเสนอด้วยข้อโต้แย้งมันก็เป็นฟังก์ชั่น
randomra

3

Japt 24 24 25 33

บันทึกแล้ว 9 7ไบต์ขอบคุณ @ETHproductions

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

ใช้ประโยชน์จากการทำลายล้าง ES6

ลองออนไลน์

Ungolfed && คำอธิบาย

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]

Uoสร้างช่วงของตัวเลขตั้งแต่ 0 ถึง U ดังนั้นUo m@[V,W]=[V+W /2,(V*W q]ควรใช้งานได้ (ยังไม่ได้ทดสอบ)
ETHproductions

โอ้และคุณไม่จำเป็นต้องใช้เครื่องหมายจุลภาคเลย :)
ETHproductions

@ETHproductions ขอบคุณอีกครั้ง! :)
Downgoat

โอ้ที่รักสิ่งนี้จะล้มเหลวสำหรับUคนอื่นที่ไม่ใช่ 1 และให้แต่ละวงออกไป นี่คืออันที่ทำงานได้อย่างถูกต้อง:Uo £[VW]=[V+W /2(V*W q]};[VW]
ETHproductions

@ETHproductions ขอบคุณ แต่rดูเหมือนว่าจะใช้งานได้ด้วย
Downgoat


3

Pyth, 12

u,.OG@*FG2EQ

ชุดทดสอบ

คำอธิบาย

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

ลืมเรื่อง@และแต่ผมไม่ได้รู้ว่าจุดประสงค์ใหม่.O E
orlp

@ orlp ah, ไม่เห็นโพสต์ของคุณฉันไม่ดีที่ฉันอยากจะแนะนำในความคิดเห็น และใช่การติดตามทุกสิ่งที่เปลี่ยนแปลงคือการต่อสู้: P
FryAmTheEggman

2

Minkolang v0.14, 23 ไบต์

ลองที่นี่ !

$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 ไบต์

ขอบคุณ mathmandan สำหรับการชี้ให้เห็นรุ่นที่สั้นกว่าโดยใช้lambdaโอเปอเรเตอร์

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

รุ่นเดิมของฉัน:

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

สำหรับความผิดหวังของฉันฟังก์ชั่นวนซ้ำ (คำตอบ a la the JavaScript และ C ++) สั้นกว่าแบบง่ายสำหรับลูป


2
คุณสามารถย่อให้เหลือน้อยลงด้วยlambdaตัวif/elseดำเนินการประกอบไปด้วย:f=lambda a,b,n:f((a+b)/2,(a*b)**.5,n-1)if n else(a,b)
mathmandan

ไม่มีปัญหา! (นอกจากนี้ฉันคิดว่านี่คือ 53 ไบต์)
mathmandan

ไฟล์. py ที่ฉันบันทึกไว้มีสถานะเป็น 55 ไบต์ มีวิธีที่ดีกว่าในการคำนวณขนาดโปรแกรมหรือไม่?
Jack Brounstein

บางครั้งคนในเว็บไซต์นี้คัดลอกและวางโค้ดของพวกเขาเป็นmothereff.in/byte-counter หากคุณสงสัยเกี่ยวกับความคลาดเคลื่อนฉันจะเดาว่า Windows กำลังแทรกอักขระบรรทัดใหม่ที่ไม่จำเป็นในตอนท้ายของไฟล์. py ของคุณ (และ Windows จะนับบรรทัดใหม่เป็น 2 ไบต์แทน 1) ไม่ว่าจะด้วยวิธีใดคุณไม่จำเป็นต้องนับว่าขึ้นบรรทัดใหม่ล่าสุดเป็นส่วนหนึ่งของรหัสของคุณสำหรับการให้คะแนน หากคุณโพสต์ข้อความหลายบรรทัดคุณควรนับ 1 สำหรับอักขระบรรทัดใหม่แต่ละบรรทัดไม่ใช่ 2 และไม่รวมบรรทัดใหม่ใด ๆ ที่ท้ายบรรทัดสุดท้ายของโค้ด (เท่าที่ฉันเข้าใจกฎอยู่แล้ว!)
mathmandan

2

R, 66 ไบต์

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

การใช้งาน:

> 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 ไบต์
Alex A.

2

Mathematica, 31 30 ไบต์

บันทึกหนึ่งไบต์ด้วย Martin Büttner

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

การใช้งาน:

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

Out[1]= {13.4582, 13.4582}

1

Lua, 62 ไบต์

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

การใช้คำสั่งอาร์กิวเมนต์บรรทัดจาก...กำหนดให้n, aและb, เคล็ดลับที่ดีผมได้เรียนรู้เกี่ยวกับ Lua เมื่อเร็ว ๆ นี้


1

Haskell, 40 ไบต์

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

ฟังก์ชั่นที่ไม่ระบุชื่อ ตัวอย่างการใช้งาน:

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

ฟังก์ชั่นแลมบ์ดา(\(a,b)->((a+b)/2,sqrt$a*b))ใช้ค่าเลขคณิตและค่าเฉลี่ยเรขาคณิตบน tuple นี่คือการวนซ้ำเริ่มต้นด้วยอินพุตแรก (tuple) จากนั้น(!!)ทำดัชนีอินพุตที่สองเพื่อระบุจำนวนการวนซ้ำ


1

Perl, 60 ไบต์

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

NB:ตามเมตาโพสต์นี้ฉันเชื่อว่าฉันได้คะแนนถูกต้อง รหัสจริง (ระหว่างเครื่องหมายคำพูดเดี่ยว) คือ 58 ตัวอักษรจากนั้นฉันเพิ่ม +2 สำหรับaและตั้งpค่าสถานะเนื่องจากเป็นข้อแตกต่างจากการเรียกใช้ที่สั้นที่สุดperl -e'...'

ข้อร้องเรียนคลุมเครือ

ฉันมีความรู้สึกซึ่งดุด่านี้ฉันขาดการปรับปรุงที่ชัดเจน ฉันรู้ว่า "ยินดีต้อนรับสู่โค้ดกอล์ฟ" แต่ฉันหมายถึงมากกว่าปกติฉันเชื่อว่ามีโอกาสง่ายที่จะย่อให้สั้นลง

ก่อนหน้านี้ฉันยุ่งกับการใช้$\เป็นเทอมที่สองที่ประสบความสำเร็จ แต่วิธีการข้างต้นจบลงด้วยการที่ 2 ไบต์สั้นลงแม้จะต้องมีการตั้งapค่าสถานะเพิ่มเติม ในทำนองเดียวกันการหลีกเลี่ยงการ$_มอบหมายอย่างชัดเจนจะดี แต่การวนซ้ำทำให้ยาก

shift@Fโรคจิตฉันเกินไป หากฉันไม่ทำเช่นนั้นแม้ว่า (หรือใช้@F=(0,...,...)แทนซึ่งไม่ได้บันทึกไบต์ใด ๆ ) แสดงว่ามีข้อผิดพลาดแบบ@Fมอบหมายงาน

ตัวอย่าง

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

เอาท์พุท

13.4581714817256 13.4581714817256

1

Julia, 49 ไบต์

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

ขั้นตอนวิธีการทำซ้ำโดยตรงสวย การใช้สัญลักษณ์และการคืนค่าหลายครั้งจะบันทึกไม่กี่ไบต์ แต่สำหรับไวยากรณ์วนซ้ำนั้นมีค่าใช้จ่ายเล็กน้อย


1

Haskell, 47 ไบต์

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

คุณสามารถบันทึกบางไบต์ใช้ ab เป็นคู่ใน f: fx 0 = x; f (a, b) n = f ((a + b) / 2, sqrt $ a * b) $ n-1
ดาเมียน

และกำหนดฟังก์ชั่นมัด
xnor

1

จูเลีย 42 ไบต์

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

นี่เป็นฟังก์ชั่นวนซ้ำfที่ยอมรับตัวเลขสามตัวและส่งกลับค่า tuple

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

Primitives นับตามmeta postนี้

สวยไปข้างหน้าไม่มากนักที่จะอธิบาย


1

Python 2, 62 61 62 ไบต์

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

3
โปรแกรมควรจะพิมพ์เพียงครั้งเดียวเมื่อมันสิ้นสุดลง
lirtosiast

1
ความเข้าใจผิดของฉัน คงที่
wflynny

1

CJam, 16 ไบต์

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

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อ อินพุตเป็นรายการที่มีค่าสองค่า (เป็นคู่) ตามด้วยการนับซ้ำ ลองออนไลน์ด้วยรหัส I / O เพื่อทำการทดสอบ

ปกติฉันจะไม่โพสต์สิ่งนี้เพราะ @PeterTaylor โพสต์คำตอบ CJam ที่ยาวพอ ๆ กันก่อนที่ฉันจะเห็นคำถาม แต่เนื่องจากโฆษณานี้เป็นจุดเริ่มต้นของซีรีส์ฉันจึงต้องการให้ตัวเลือกของฉันเปิดอยู่ในกรณีที่ซีรีส์น่าสนใจ

ในขณะที่ความยาวเหมือนกับคำตอบของปีเตอร์รหัสไม่ได้ ฉันเลือกรูปแบบการป้อนข้อมูลที่แตกต่างกันโดยรับค่าสองค่าในรายการโดยที่ Peter ใช้ค่าแยกกัน ดังนั้นในขณะที่มีไม่มากไปกับรูปแบบการป้อนข้อมูลทั้งรหัสดูเหมือนแตกต่าง

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

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

การใช้งาน:

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

หากฉันเปลี่ยนอินพุตจากa,b,nเป็น(a,b),nฉันสามารถบันทึกไม่กี่ไบต์

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

การใช้งาน:

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
}

จริง ๆ แล้วฉันจะแลกเปลี่ยน... *กับ... -> (\a,\b) { a =~= b }แล้วจะไม่จำเป็นต้องใช้$^nพารามิเตอร์
(อย่าใช้==แทน=~=หรืออาจไม่หยุด)

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 ไบต์

รหัส:

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

ตัวอย่าง:

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

ลองออนไลน์ได้ที่นี่


0

Java, 103 96 84 ไบต์

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

ตรวจสอบการทดสอบทั้งหมด

รุ่นเก่า (96 ไบต์):

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

รุ่นเก่า (103 ไบต์):

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;}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.