Rosetta Stone Challenge: อะไรคือค่าเฉลี่ยต่อไป?


38

เป้าหมายของการท้าทาย Rosetta Stone คือการเขียนวิธีแก้ปัญหาในภาษาต่างๆให้ได้มากที่สุด แสดงการเขียนโปรแกรมได้หลายภาษาของคุณ!

ความท้าทาย

เมื่อคนใช้คำว่า "ค่าเฉลี่ย" พวกเขามักจะหมายถึงค่าเฉลี่ยเลขคณิตซึ่งเป็นผลรวมของตัวเลขหารด้วยจำนวนของตัวเลข อย่างไรก็ตามยังมีความหมายอื่น ๆ อีกมากมายที่จะใช้คำว่า "ค่าเฉลี่ย" รวมทั้งค่าเฉลี่ยฮาร์โมนิที่ค่าเฉลี่ยเรขาคณิตที่ค่าเฉลี่ยของค่าเฉลี่ยกำลังสองและค่าเฉลี่ย contraharmonic

ความท้าทายของคุณคือการเขียนโปรแกรมที่ป้อนรายการตัวเลขและแสดงผลลัพธ์ที่แตกต่างกัน 5 วิธี นอกจากนี้คุณกำลังพยายามที่จะเขียนโปรแกรมในขณะที่หลาย ๆ ภาษาที่เป็นไปได้ คุณได้รับอนุญาตให้ใช้ฟังก์ชั่นไลบรารีมาตรฐานทุกประเภทที่ภาษาของคุณมีเนื่องจากนี่เป็นการนำเสนอภาษาเป็นส่วนใหญ่

อินพุต

อินพุตจะเป็นรายการของตัวเลขที่เป็นบวก

1,2,3,4,5
1.7,17.3,3.14,24,2.718,1.618
8.6
3,123456
10.1381,29.8481,14.7754,9.3796,44.3052,22.2936,49.5572,4.5940,39.6013,0.9602
3,4,4,6.2,6.2,6.2

เอาท์พุต

เอาต์พุตจะเป็นห้าวิธีในลำดับที่กล่าวถึงข้างต้น (ฮาร์โมนิกเรขาคณิตเลขคณิตกำลังสองกำลังสอง) สะดวกนี้เป็นเช่นเดียวกับการสั่งซื้อที่เพิ่มขึ้น

2.18978,2.6052,3,3.31662,3.66667
3.01183,4.62179,8.41267,12.2341,17.7915
8.6,8.6,8.6,8.6,8.6
5.99985,608.579,61729.5,87296.6,123453.
5.95799,14.3041,22.5453,27.9395,34.6243
4.5551,4.74682,4.93333,5.10425,5.28108

จะมีความผ่อนปรนที่สมเหตุสมผลในรูปแบบ I / O แต่ฉันต้องการความแม่นยำทศนิยมหลายตำแหน่ง เนื่องจากฉันต้องการเอาต์พุตทศนิยมคุณสามารถรับอินพุตทศนิยมได้

เกณฑ์การชนะอย่างมีวัตถุประสงค์

สำหรับเกณฑ์การชนะอย่างมีวัตถุประสงค์นี่คือ: แต่ละภาษาเป็นการแข่งขันแยกกันว่าใครสามารถเขียนผลงานที่สั้นที่สุด แต่ผู้ชนะโดยรวมจะเป็นคนที่ชนะการแข่งขันย่อยมากที่สุดเหล่านี้ ซึ่งหมายความว่าผู้ที่ตอบคำถามในภาษาแปลก ๆ หลาย ๆ แห่งจะได้รับการพิจารณาเป็นพิเศษ Code-golf ส่วนใหญ่เป็น tiebreaker เมื่อมีวิธีแก้ปัญหามากกว่าหนึ่งภาษา: บุคคลที่มีโปรแกรมสั้นที่สุดจะได้รับเครดิตสำหรับภาษานั้น

หากมีการเสมอกันผู้ชนะจะเป็นผู้ที่ส่งผลงานรองอันดับสอง (และอื่น ๆ )

กฎข้อ จำกัด และหมายเหตุ

โปรแกรมของคุณสามารถเขียนในภาษาใด ๆ ที่มีอยู่ก่อนวันที่ 2 กันยายน 2014 ฉันจะต้องพึ่งพาชุมชนเพื่อตรวจสอบคำตอบบางอย่างที่เขียนในภาษาที่แปลกประหลาด / ลึกลับมากกว่าเนื่องจากฉันไม่สามารถทดสอบได้ พวกเขา

โปรดเก็บข้อมูลที่ส่งมาทั้งหมดของคุณไว้ในคำตอบเดียว

นอกจากนี้ยังไม่มีผู้รู้เท่าทันที่มีคำตอบเดียวกันในภาษาที่แตกต่างกันเล็กน้อย ฉันจะเป็นผู้ตัดสินว่าอะไรคือผลงานที่ส่งต่างออกไปมากพอ


กระดานแต้มนำปัจจุบัน

ส่วนนี้จะได้รับการปรับปรุงเป็นระยะเพื่อแสดงจำนวนภาษาและผู้ที่เป็นผู้นำในแต่ละภาษา

  • อัลคาลอย (337) - การสลายตัวเบต้า
  • APL (42) - อัลกอริทึม
  • Awk (78) - เดนนิส
  • BBC BASIC (155) - การสลายตัวเบต้า
  • C (136) - เดนนิส
  • C ++ (195) - ซีตา
  • C # (197) - Martin Büttner
  • CJam (43) - เดนนิส
  • Clojure (324) - Michael Easter
  • งูเห่า (132) - Ourous
  • CoffeeScript (155) - Martin Büttner
  • Commodore BASIC (104) - Mark
  • Common LISP (183) - DLosc
  • Erlang (401) - Mark
  • Fortran (242) - Kyle Kanos
  • Fortran 77 (286) - การสลายตัวเบต้า
  • GNU bc (78) - เดนนิส
  • GolfScript (83) - เดนนิส
  • Groovy (157) - Michael Easter
  • Haskell (140) - ซีตา
  • J (28) - อัลกอริทึม
  • Java (235) - Michael Easter
  • JavaScript (ES6) (112) - เดนนิส
  • JRuby (538) - Michael Easter
  • Julia (79) - Martin Büttner
  • Lua (113) - AndoDaan
  • Mathematica (65) - Martin Büttner
  • Matlab (63) - Martin Büttner
  • อ็อกเทฟ (68) - เดนนิส
  • Openscript (849?) - COTO
  • ปาสกาล (172) - เครื่องหมาย
  • Perl (76) - Grimy
  • PHP (135) - เดนนิส
  • POV-Ray 3.7 (304) - Mark
  • อารัมภบท (235) - DLosc
  • Pyth (52) - Dennis
  • Python 2 (96) - เดนนิส
  • Python 3 (103) - DLosc
  • Q (53) - อัลกอริทึม
  • Q'Nial (68) - อัลกอริธึม
  • QBasic (96) - DLosc
  • R (91) - plannapus
  • Ruby (118) - Martin Büttner
  • สนิม (469) - Vi
  • สกาล่า (230) - Michael Easter
  • T-SQL (122) - MickyT
  • TI-Basic (85) - อืมพาน
  • TypeScript (393) - rink.attendant.6
  • VBA (Excel) (387) - การยืดกล้ามเนื้อ
  • wxMaxima (134) - Kyle Kanos

การจัดอันดับผู้ใช้ปัจจุบัน

  1. เดนนิส (10)
  2. Martin Büttner (6)
  3. Michael Easter (5)
  4. ทำเครื่องหมาย, DLosc, อัลกอริทึม (4)
  5. เบต้าสลาย (3)
  6. Zeta, Kyle Kanos (2)
  7. Ourous, AndoDaan, COTO, Grimy, plannapus, Vi., MickyT, Ypnypn, ลานสเก็ต. ผู้ดูแล 6, คนบ้ายืด (1)

(ถ้าฉันทำผิดพลาดในการจัดอันดับข้างต้นแจ้งให้เราทราบและฉันจะแก้ไขนอกจากนี้ tiebreaker ยังไม่ได้นำมาใช้)


เมื่อคุณพูดว่าคุณผ่อนปรนใน I / O นั่นหมายถึงฟังก์ชั่นที่ได้รับอนุญาตเช่นกันหรือทุกอย่างต้องเป็นโปรแกรม (เท่าที่ความคิดนั้นเข้าใจในบางภาษา)?
Martin Ender

คุณไม่ได้รับค่าเฉลี่ยที่ชื่นชอบ: (a-b)/ln(a/b)ค่าเฉลี่ยลอการิทึม ฉันจะยอมรับว่าวันนี้เท่านั้นที่ฉันพบว่ามัน generalises ชุดตัวอย่างมากกว่าสอง :-) en.wikipedia.org/wiki/Logarithmic_mean
Level River St

1
2 กันยายนใช่มั้ย
amalloy

1
นอกจากนี้ยัง - เมื่อมันมาถึงการสร้างขึ้นในคำสั่งใน Linux คุณได้พิจารณาbc, awkฯลฯ เพื่อเป็น "ภาษา" หรือ "คำสั่ง" - ดังนั้นจะวิธีการต่าง ๆ ในการดำเนินการนี้จากเปลือกถูกนับในภาษาที่แตกต่างกัน?
Floris

2
@ Floris หากมีข้อสงสัย: meta.codegolf.stackexchange.com/a/2073/8478
Martin Ender

คำตอบ:


22

ภาษา: 1

Openscript (หลายร้อย)

(ภาษาที่ฉันปิดบังและชื่นชอบการเขียนโปรแกรมที่น่าเศร้าเพราะฉันเรียนรู้ที่จะเขียนโปรแกรมเกี่ยวกับมันเมื่อหลายปีก่อน)

openFile "inputs.txt"
readFile "inputs.txt" to EOF

put it into my input_string

closeFile "inputs.txt"

local inputs[]

fill the inputs with my input_string in [item] order

put 0 into the harmonic_mean
put 0 into the geometric_mean
put 0 into the arithmetic_mean
put 0 into the quadratic_mean

put the length of the inputs into n

step i from 1 to n
    get inputs[i]
    increment the harmonic_mean by 1/it
    increment the geometric_mean by log( it )
    increment the arithmetic_mean by it
    increment the quadratic_mean by it*it
end

get "outputs.txt"
createFile it

writeFile n/harmonic_mean                & "," to it 
writeFile exp( geometric_mean/n )        & "," to it
writeFile arithmetic_mean/n              & "," to it
writeFile sqrt( quadratic_mean/n )       & "," to it
writeFile quadratic_mean/arithmetic_mean to it

closeFile it

21
put the length of the inputs into n? O_O ฉันรักภาษานี้แล้ว
DLosc

2
ไวยากรณ์ทำให้ผมนึกถึงเชฟ
Comintern

2
ไวยากรณ์ทำให้ฉันนึกถึงภาษาโคบอล
Amadan

3
สำหรับภาษาที่ดูเป็นธรรมชาติมากขึ้น (และเฉพาะการใช้งานมากขึ้นโปรดดูข้อมูล 7)
Beska

3
แจ้ง 7 เป็นภาษาจริง - เป็นเพียงที่ I / O คือการผจญภัยข้อความ ผู้คนได้เขียนเครื่องมือหมากรุกในนั้นและเส้นทางที่สั้นที่สุดของ Dijkstra อยู่ที่: en.literateprograms.org/Dijkstra's_algorithm_(Inform_7)
Jerry Jeremiah

18

ภาษา: 13

ฉันคิดว่ารายการนี้ควรมีภาษาการเขียนโปรแกรมทุกภาษาที่ฉันรู้ดีพอที่จะแก้ปัญหาอย่างน้อยที่สุดได้ง่ายฉันจะพยายามทำให้รายการนี้สมบูรณ์ตลอดเวลาเมื่อฉันมองหาภาษาใหม่ ๆ (ฉันเคยรู้จัก Smalltalk และ Delphi บ้าง แต่ฉันต้องค้นหามากขึ้นเพื่อเพิ่มความรู้สึกที่ถูกต้อง)

C, 196 190 171 165 ไบต์

main(int c,char**v){float n=c-1,x,h,g=1,q,a=h=q=0;for(;c-1;h+=1/x,g*=pow(x,1/n),a+=x/n,q+=x*x/n)sscanf(v[--c],"%f",&x);printf("%f,%f,%f,%f,%f",n/h,g,a,sqrt(q),q/a);}

อ่านอินพุตเป็นอาร์กิวเมนต์บรรทัดรับคำสั่งแต่ละรายการและเขียนรายการที่คั่นด้วยเครื่องหมายจุลภาคของวิธีการไปยัง STDOUT

ขอบคุณสำหรับการปรับปรุงบางอย่างในเควนติน

C ++, 200 ไบต์

นี่คือเหมือนกับรหัส C ข้างต้นบวกสองรวมถึง ฉันรวมสิ่งนี้เพราะมันนานกว่าการส่ง C ++ ที่ชนะดังนั้นฉันเดาว่าไม่มีอันตรายใด ๆ เกิดขึ้นและฉันต้องการให้โพสต์นี้มีทุกภาษาที่ฉันรู้จัก :)

#include <cmath>
#include <cstdio>
main(int c,char**v){float n=c-1,x,h,g=1,q,a=h=q=0;for(;c-1;h+=1/x,g*=pow(x,1/n),a+=x/n,q+=x*x/n)sscanf(v[--c],"%f",&x);printf("%f,%f,%f,%f,%f",n/h,g,a,sqrt(q),q/a);}

C #, 220 197 ไบต์

namespace System{using Linq;class F{double[]f(double[]l){double n=l.Length,a=l.Sum()/n,q=l.Sum(x=>x*x)/n;return new[]{n/l.Sum(x=>1/x),l.Aggregate((p,x)=>p*Math.Pow(x,1.0/n)),a,Math.Sqrt(q),q/a};}}}

กำหนดฟังก์ชั่นในชั้นเรียนโดยใช้Listคู่ผสมและคืนอาร์เรย์คู่ผสมด้วยค่าเฉลี่ยห้าค่า

ขอบคุณสำหรับการปรับปรุง Visual Melon และ Bob

CJam, 52 ไบต์

ea_,:L;:d_Wf#:+L\/\_:*1Ld/#\_:+L/:A\2f#:+L/:QmqQA/]p

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่งและพิมพ์รายการที่มีห้าค่าไปยัง STDOUT

CoffeeScript ขนาด 155 ไบต์

นี่เกือบจะเหมือนกันกับโซลูชัน JavaScript ต่อไป (และเริ่มแรกฉันไม่นับด้วยเหตุผลนั้น) แต่ OP ได้รวมไว้ในกระดานคะแนนแล้วดังนั้นฉันจึงเลื่อนไปที่การส่งแบบเต็ม พวกเขาเป็นภาษาที่แตกต่างกันในทางเทคนิคหลังจากทั้งหมด

f=(l)->l.r=l.reduce;n=l.length;[n/l.r(((s,x)->s+1/x),0),Math.pow(l.r(((p,x)->p*x),1),1/n),a=l.r(((s,x)->s+x),0)/n,Math.sqrt(q=l.r(((s,x)->s+x*x),0)/n),q/a]

JavaScript (ES6), 155 153 ไบต์

f=l=>{l.r=l.reduce;n=l.length;return[n/l.r((s,x)=>s+1/x,0),Math.pow(l.r((p,x)=>p*x,1),1/n),a=l.r((s,x)=>s+x,0)/n,Math.sqrt(q=l.r((s,x)=>s+x*x,0)/n),q/a]}

กำหนดฟังก์ชั่นรับอาร์เรย์ของตัวเลขและส่งกลับอาร์เรย์ด้วยห้าวิธี

ขอบคุณสำหรับการปรับปรุง William Barbosa

Julia, 79 ไบต์

f(l)=(n=length(l);[n/sum(1/l),prod(l)^(1/n),a=mean(l),q=norm(l)/sqrt(n),q*q/a])

กำหนดฟังก์ชั่นการจดรายการตัวเลขและส่งคืนรายการด้วยค่าเฉลี่ยห้าค่า

Lua ขนาด 120 ไบต์

f=function(l)h=0;q=0;a=0;g=1;for i=1,#l do x=l[i]h=h+1/x;a=a+x/#l;g=g*x^(1/#l)q=q+x*x/#l end;return#l/h,g,a,q^.5,q/a end

กำหนดฟังก์ชั่นการจดรายการตัวเลขและคืนค่า 5 ค่าแยกกันสำหรับค่าเฉลี่ย

Mathematica, 73 67 65 ไบต์

f[l_]:={1/(m=Mean)[1/l],GeometricMean@l,a=m@l,Sqrt[q=m[l*l]],q/a}

กำหนดฟังก์ชั่นการรับรายการหมายเลขจุดลอยตัวและส่งคืนรายการด้วยค่าเฉลี่ยห้าค่า

เรื่องสนุก: Mathematica มีทั้งหมด 5 วิธีในตัว (และนั่นคือการส่งดั้งเดิมของฉัน) แต่พวกเขาสามคนสามารถนำไปใช้ในตัวละครน้อยกว่าชื่อฟังก์ชั่นของพวกเขา

Matlab, 65 63 ไบต์

l=input('');a=mean(l);q=rms(l);harmmean(l)
geomean(l)
a
q
q*q/a

ร้องขออินพุตเป็นอาร์เรย์ของตัวเลขจากผู้ใช้และเอาต์พุตทั้งห้าค่า

ขอบคุณสำหรับการปรับปรุง Dennis Jaheruddin

PHP ≥ 5.4, 152 149 143 ไบต์

function f($l){$g=1;$n=count($l);foreach($l as$x){$q+=$x*$x/$n;$h+=1/$x;$g*=pow($x,1/$n);}return[$n/$h,$g,$a=array_sum($l)/$n,sqrt($q),$q/$a];}

การใช้งานฟังก์ชั่นเช่นเดียวกับก่อนหน้านี้

ขอบคุณสำหรับการปรับปรุง Ismael Miguel

Python 2, 127 ไบต์

def f(l):n=len(l);a=sum(l)/n;q=sum(x*x for x in l)/n;return[n/sum(1/x for x in l),reduce(lambda x,y:x*y,l)**(1./n),a,q**.5,q/a]

การใช้งานฟังก์ชั่นเช่นเดียวกับก่อนหน้านี้

Ruby, 129 118 ไบต์

f=->l{n=l.size
r=->l{l.reduce :+}
[n/r[l.map{|x|1/x}],l.reduce(:*)**(1.0/n),a=r[l]/n,(q=r[l.map{|x|x*x}]/n)**0.5,q/a]}

การใช้งานฟังก์ชั่นเช่นเดียวกับก่อนหน้านี้


ฉันรู้นี้ค่อนข้างหลังจากที่ความจริง แต่คุณจะสูญเสีย 3 จูเลียไบต์โดยใช้ในสถานที่ของnorm(l)/n^.5 norm(l)/sqrt(n)
Alex A.

13

4 ภาษา

J - 32 28 ถ่าน!

ฟังก์ชั่นรับรายการตัวเลขเป็นอาร์กิวเมนต์เพียงอย่างเดียว

%a,^.a,[a(,,]%%)*:a=.+/%#&.:

a นี่คือคำวิเศษณ์ซึ่ง J ทำหน้าที่ที่สอง

  • +/ % # คือรถไฟใน J หมายถึง Sum Divided-by Count ความหมายของค่าเฉลี่ยเลขคณิต
  • &.:คือร่วมที่เรียกว่าภายใต้ซึ่งu&.:v(y)เทียบเท่ากับvi(u(v(y)))และเป็นสิ่งที่ตรงกันข้ามการทำงานของvi vใช่J สามารถรับหน้าที่ผกผันได้
  • ในที่สุดคุณสมบัติที่มีประโยชน์ของ J คือฟังก์ชั่นบางอย่างสามารถวนซ้ำรายการโดยอัตโนมัติได้เนื่องจาก J รู้ที่จะใช้มันตามจุดหากไม่เหมาะสมที่จะใช้กับอาร์กิวเมนต์ทั้งหมด ยกกำลังสองของรายการจึงเป็นรายการของกำลังสองยกตัวอย่างเช่น

ดังนั้นaรับฟังก์ชั่นด้านซ้ายและส่งกลับค่าเฉลี่ยที่ "ปรับ" ค่าโดยฟังก์ชั่นรับค่าเฉลี่ยเลขคณิตจากนั้นกลับการปรับค่าในภายหลัง

  • %aคือค่าเฉลี่ยฮาร์มอนิกเพราะค่า%ซึ่งกันและกันและเป็นค่าผกผันของมันเอง
  • ^.aเป็นค่าเฉลี่ยทางเรขาคณิตเพราะ^.เป็นลอการิทึมธรรมชาติและค่าผกผันของมันคือเลขชี้กำลัง(Π x)^(1/n) = exp(Σ log(x)/n)
  • [aคือค่าเฉลี่ยเลขคณิตเพราะ[เป็นฟังก์ชันตัวตน
  • *:aคือค่าเฉลี่ยกำลังสองเนื่องจาก*:เป็นสแควร์และค่าผกผันของมันคือสแควร์รูท
  • contraharmonic ช่วยให้เรามีปัญหาทั้งหมด - ค่าเฉลี่ยของสี่เหลี่ยมหารด้วยค่าเฉลี่ย - ดังนั้นเราจึงทำคณิตศาสตร์เล็กน้อยเพื่อให้ได้มา: ( *:aหารด้วย ( [aหารด้วย*:a)) [a(]%%)*:aลักษณะเช่นนี้ ในขณะที่เราอยู่ที่นี่เราได้เตรียมวิธีการแต่ละวิธีไว้, [a(,,]*%~)*:a.

สุดท้ายเราใช้เครื่องหมายจุลภาคเพื่อผนวกผลลัพธ์ที่เหลือเข้าด้วยกัน เราไม่ต้องการ parens เพิ่มเติมเนื่องจากการต่อข้อมูล (ในกรณีนี้เป็นอย่างน้อย) การเชื่อมโยง

ใช้งานที่ J REPL:

   (%a,^.a,[a(,,]%%)*:a=.+/%#&.:) 1,2,3,4,5   NB. used inline
2.18978 2.60517 3 3.31662 3.66667
   f =: %a,^.a,[a(,,]%%)*:a=.+/%#&.:          NB. named
   f 1.7,17.3,3.14,24,2.718,1.618
3.01183 4.62179 8.41267 12.2341 17.7915
   f 8.6
8.6 8.6 8.6 8.6 8.6
   f 3,123456
5.99985 608.579 61729.5 87296.6 123453
   f 10.1381,29.8481,14.7754,9.3796,44.3052,22.2936,49.5572,4.5940,39.6013,0.9602
5.95799 14.3041 22.5453 27.9395 34.6243
   f 3,4,4,6.2,6.2,6.2
4.5551 4.74682 4.93333 5.10425 5.28108

คำถาม - 53 คำ

ฟังก์ชันอาร์กิวเมนต์เดี่ยว เราเพียงแค่ทำรายการของวิธีการทั้งหมดที่เราต้องการ

{s:(a:avg)x*x;(1%a@1%x;exp a log x;a x;sqrt s;s%a x)}

สิ่งเดียวกันในรุ่นอื่น ๆ ของ k อยู่ด้านล่าง

  • k4, 51 ตัวอักษร: {s:(a:avg)x*x;(%a@%x;exp a log x;a x;sqrt s;s%a x)}
  • k2, 54 ตัวอักษร: {s:(a:{(+/x)%#x})x*x;(%a@%x;(*/x)^%#x;a x;s^.5;s%a x)}

APL - 42 อักขระ

ฟังก์ชั่นการจดรายการเป็นอาร์กิวเมนต์

{(÷M÷⍵)(*M⍟⍵)A(S*.5),(S←M⍵*2)÷A←(M←+/÷≢)⍵}

อธิบายโดยการระเบิด:

{                                         } ⍝ function with argument ⍵
                                   +/÷≢     ⍝ Sum Divide Length, aka mean
                                 M←         ⍝ assign function to M for Mean
                              A←(M     )⍵   ⍝ arithmetic Mean, assign to A
                     (S←M⍵*2)               ⍝ Mean of squares, assign to S
                      S      ÷A             ⍝ S divide A, aka contraharmonic mean
              (S*.5)                        ⍝ sqrt(S), aka quadratic mean/RMS
                    ,                       ⍝ concatenate into a list
             A                              ⍝ prepend A (APL autoprepends to lists)
        *M⍟⍵                                ⍝ exp of Mean of logs, aka geometric
       (    )                               ⍝ prepend (auto)
  ÷M÷⍵                                      ⍝ recip of Mean of recips, aka harmonic
 (    )                                     ⍝ prepend (auto)

Q'Nial - 68 ตัวอักษร

คุณจะรักคนนี้

op\{$is/[+,tally];^is$*[pass,pass];[1/$(1/),exp$ln,$,sqrt^,/[^,$]]\}

Q'Nial เป็นภาษาอาเรย์อื่นที่มีการใช้งานของNialซึ่งมีพื้นฐานมาจากทฤษฎี Array ที่คลุมเครือในแบบแซมแฮสเค็ลมีพื้นฐานมาจากทฤษฎีหมวดหมู่ (มาที่นี่ ) มันแตกต่างจากสามอย่างอื่น - แยกวิเคราะห์จากซ้ายไปขวาก่อนอื่น! - แต่มันยังเกี่ยวข้องกับพวกเขามากกว่าภาษาอื่น ๆ


ฉันรู้ว่ามีวิธีที่ดีกว่าในการทำเช่นนี้ใน APL ดังนั้นผมจึงสามารถเคารพตัวแปรผมกำหนดไว้ที่มันขวา ; จะไม่คิดว่าตัวเอง ... - รหัส J นั้นน่าประทับใจ! ทุกครั้งที่ฉันเห็นคำตอบของคุณฉันพูดกับตัวเองคุณต้องเรียนรู้ภาษานั้น แต่แล้วฉันก็เริ่มอ่านเอกสาร / กวดวิชาและทันใดนั้นฉันก็ไม่รู้ว่าฉันอยู่ในชั้นเรียนภาษาอังกฤษหรือที่สถานีรถไฟ ... : P
Dennis

@Dennis Yeah การมอบหมาย APL / J / K จะส่งคืนค่า (ส่วนใหญ่!) และขอบคุณ. :) เมื่อเรียนรู้ J มันอาจเริ่มสับสนกับสิ่งที่ตรงกับส่วนของภาษาบ้านของคุณดังนั้น Iverson จึงห้าม F-word (ฟังก์ชั่น) เมื่อเขียนเอกสารเพื่อพยายามบังคับให้คุณเริ่มต้นใหม่ กลิ้งกับมันและมาพร้อมกับการเปรียบเทียบของคุณเองในภายหลังเป็นวิธีที่ง่ายที่สุดที่จะทำ
algorithmshark

ฉันยังคงรักษา APL เป็นภาษาอาเรย์ที่อ่านได้มากที่สุด มากสำหรับ snarks "เขียนอย่างเดียว"! เลวร้ายเกินไป GNU APL ไม่สนับสนุนใด ๆ ของไวยากรณ์ที่ทันสมัย (ซ้อนกัน D-funs, การกำหนดขอบเขตศัพท์ผลตอบแทนตามเงื่อนไขตะขอและรถไฟ ... นรกมันฉายาบน/⍨) มันอาจจะมีความหมายสำหรับ porting รหัสเก่าจริงๆ คุณใช้อะไร Dyalog? NARS2000? ฉันคิดว่ามันโชคร้ายจริงๆที่ J ใช้วิธีเสียง ASCII การนำภาษานั้นไปใช้นั้นเป็นงานที่อัจฉริยะ แต่ฉันไม่สามารถแยกคำตอบออกจากใจได้]a(,,]*%~)*:a
Tobia

@Tobia ฉันใช้ Dyalog ชั่วครู่ แต่จริงๆแล้วฉันรู้ APL ไม่พอ ฉันเป็นแฟนบอย J / K ส่วนใหญ่เป็นเพราะ ASCII เป็นแบบพกพาและรุ่นอันดับนั้นสมเหตุสมผลกว่าของ APL ( [0.5]? Ew.) ด้วยการฝึกฝนคุณจะคุ้นเคยกับการพูดโดยปริยาย J มันแย่กว่านี้มาก
algorithmshark

12

12 ภาษา


CJam, 45 44 43 ไบต์

q~:Q,:LQWf#:+/Q:*LW##Q:+L/_Q2f#:+L/_mq\@/]`

อ่านอาร์เรย์ของลอย (เช่น[1.0 2.0 3.0 4.0 5.0]) จาก STDIN ลองออนไลน์


APL, 67 61 53 52 50 ไบต์

{(N÷+/÷⍵)(×/⍵*÷N)A(Q*÷2),(Q←+/(⍵*2)÷N)÷A←+/⍵÷N←⍴⍵}

ลองออนไลน์


Pyth, 55 52 ไบต์

JyzKlJ=YcsJK=Zcsm^d2JK(cKsmc1kJ ^u*GHJc1K Y ^Z.5 cZY

อ่านตัวเลขที่คั่นด้วยช่องว่าง (เช่น1 2 3 4 5) จาก STDIN


อ็อกเทฟ, 68 ไบต์

#!/usr/bin/octave -qf
[mean(I=input(''),"h") mean(I,"g") a=mean(I) q=mean(I.*I)**.5 q*q/a]

ไม่นับ Shebang อ่านอาร์เรย์ (เช่น[1 2 3 4 5]) จาก STDIN


GNU bc, 78 ไบต์

#!/usr/bin/bc -l
while(i=read()){h+=1/i;g+=l(i);a+=i;q+=i*i;n+=1}
n/h;e(g/n);a/n;sqrt(q/n);q/a

นับ Shebang เป็น 1 ไบต์ ( -lสวิตช์) อ่าน whitespace ที่คั่นด้วย float จาก STDIN ตามด้วยศูนย์


Awk, 78 ไบต์

#!/usr/bin/awk -f
{h+=1/$0;g+=log($0);a+=$0;q+=$0^2;n++}END{print n/h,exp(g/n),a/n,(q/n)^.5,q/a}

ไม่นับ Shebang อ่านหนึ่งหมายเลขต่อบรรทัดจาก STDIN


GolfScript, 86 83 ไบต์

n%{~.2.-1:$??./*\`,10\?/\+\;}%..,:^0@{$?+}//p.{*}*^$??p.{+}*^/.p\0\{.*+}/^/.2$??p\/

GolfScript ไม่มีการสนับสนุนในตัวสำหรับการลอยดังนั้นรหัสจะถูกแยกวิเคราะห์ ดังนั้นรูปแบบการป้อนข้อมูลที่ค่อนข้างเข้มงวด: คุณต้องป้อนข้อมูล1.0และ0.1มากกว่า1, หรือ1..1

อ่าน float (ตามที่อธิบายข้างต้น) ทีละบรรทัดจาก STDIN ลองออนไลน์


Perl, 90 85 ไบต์

#!/usr/bin/perl -n
$h+=1/$_;$g+=log;$a+=$_;$q+=$_**2}{$,=$";print$./$h,exp$g/$.,$a/$.,($q/$.)**.5,$q/$a

นับ Shebang เป็น 1 ไบต์ ( -nสวิตช์) อ่านหนึ่งหมายเลขต่อบรรทัดจาก STDIN


Python 2, 102 96 ไบต์

#!/usr/bin/python
h=a=q=n=0;g=1
for i in input():h+=1/i;g*=i;a+=i;q+=i*i;n+=1
print n/h,g**n**-1,a/n,(q/n)**.5,q/a

ไม่นับ Shebang อ่านรายการของการลอยตัว (เช่น, 1.0,2.0,3.0,4.0,5.0) จาก STDIN


ECMAScript 6 (JavaScript), 114 112 ไบต์

m=I=>{for(g=1,h=a=q=n=0,p=Math.pow;i=I.pop();h+=1/i,g*=i,a+=i,q+=i*i)n++;
return[n/h,p(g,1/n),a/n,p(q/n,.5),q/a]}

ไม่นับ LF คาดว่าอาร์เรย์ (เช่น[1,2,3,4,5]) เป็นอาร์กิวเมนต์


PHP, 135 (หรือ 108?) ไบต์

#!/usr/bin/php
<?for($c=1;$c<$argc;$c++){$i=$argv[$c];$h+=1/$i;$g+=log($i);$a+=$i;$q+=$i*$i;$n++;}
print_r([$n/$h,exp($g/$n),$a/$n,sqrt($q/$n),$q/$a]);

ไม่นับ Shebang หรือ LF อ่านลอยเป็นอาร์กิวเมนต์บรรทัดคำสั่ง

ฉันมีวิธีแก้ปัญหาที่สั้นกว่า แต่ฉันไม่รู้วิธีนับจำนวนไบต์:

php -R '$i=$argn;$h+=1/$i;$g+=log($i);$a+=$argn;$q+=$i^2;$n++;' \
-E 'print_r([$n/$h,exp($g/$n),$a/$n,sqrt($q/$n),$q/$a]);'

การนับจำนวนไบต์ในแต่ละสตริงของโค้ดและเพิ่มสองสำหรับ-Rและ-Eวิธีนี้จะได้คะแนน 108


C, 172 140 139 137 136 ไบต์

float i,h,g=1,a,q,n;main(){for(;scanf("%f",&i)+1;n++)h+=1/i,g*=i,a+=i,q+=i*i;
printf("%f %f %f %f %f",n/h,pow(g,1/n),a/n,sqrt(q/n),q/a);}

ไม่นับ LF gcc -lmคอมไพล์ด้วย อ่าน whitespace ที่คั่นด้วย float จาก STDIN


คุณสามารถบันทึกหนึ่งไบต์ใน C: while(cond)...,n++;vsfor(;cond;n++)...;
Zeta

เราจำเป็นต้องรวมสาย shebang ไว้ในการนับของเราหรือไม่?
OregonTrail

@OraTraTrail: ฉันได้รวม Shebangs ไว้ในโค้ดเพราะมันง่ายกว่าที่จะอธิบายให้ใช้interpreter switches scriptสำหรับทุกการส่ง อนุสัญญาก็คือเส้น Shebang จะไม่ถูกนับเว้นแต่มีสวิตช์ที่ไม่ใช่ค่าเริ่มต้น ตามที่ระบุไว้ในคำตอบของฉันฉันนับ#!/usr/bin/awk -fเป็นศูนย์ไบต์ ( -fหมายถึงอ่านโปรแกรมจากไฟล์) แต่#!/usr/bin/perl -nเป็นหนึ่งไบต์ ( -nหมายถึงย้ำผ่านสายอินพุต)
Dennis

คุณไม่ควรนับ-qให้กับอ็อกเทฟและ-lmสำหรับซี?
nyuszika7h

-qเป็นเพียงการส่งออกที่เงียบ -lmเป็นสิ่งจำเป็นโดย GCC คอมไพเลอร์อื่น ๆ อาจไม่จำเป็นต้องใช้
เดนนิส

6

J (50):

นี่คือสิ่งที่ J ดีใน:

(#%+/@:%),(#%:*/),(+/%#),%:@(%@#*+/@:*:),+/@:*:%+/

เช่นเคย: การระเบิดในโรงงานยิ้ม อย่างไรก็ตามรอยยิ้มบางส่วนถูกทิ้งไว้โดยไม่บุบสลายในเวลานี้:)และ:*:(นั่นคือผู้ชายที่มีสี่ตาและอัญมณีฝังอยู่ในใบหน้าของเขา) เซสชั่นการโต้ตอบของฉันที่ใช้ในการสร้างสิ่งนี้: http://pastebin.com/gk0ksn2b

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

   f=:(#%+/@:%),(#%:*/),(+/%#),%:@(%@#*+/@:*:),+/@:*:%+/
   f 1,2,3,4,5
2.18978 2.60517 3 3.31662 3.66667
   f 1.7,17.3,3.14,24,2.718,1.618
3.01183 4.62179 8.41267 12.2341 17.7915
   f 8.6
8.6 8.6 8.6 8.6 8.6
   f 3,123456
5.99985 608.579 61729.5 87296.6 123453
   f 10.1381,29.8481,14.7754,9.3796,44.3052,22.2936,49.5572,4.5940,39.6013,0.9602
5.95799 14.3041 22.5453 27.9395 34.6243
   f 3,4,4,6.2,6.2,6.2
4.5551 4.74682 4.93333 5.10425 5.28108

คำอธิบาย:

อย่างที่คุณคาดหวังมีฟังก์ชั่น 5 อย่างที่รวมอยู่ในรายการที่มีขบวนส้อมและตะขอ (ไม่ต้องกังวลเกี่ยวกับมันเป็นเพียงวิธีที่สะดวกในการสร้างฟังก์ชั่นหลาย ๆ เอาต์พุตในรายการเดียว)

บรรทัดที่ฉันใช้เพื่อทำให้ J สร้างคำตอบนี้อาจชัดเจนขึ้น:

   f=:harmonic , Geometric , arithmatic , rms , contraharmonic
   f
harmonic , Geometric , arithmatic , rms , contraharmonic
   f f.
(# % +/@:%) , (# %: */) , (+/ % #) , %:@(%@# * +/@:*:) , +/ %~ +/@:*:

มาดูพวกมันแยกกัน

สอดคล้องกัน

(# % +/@:%)
  • # - ความยาว (ของอาร์เรย์)
  • % - หารด้วย
  • +/@:%- ผลรวม ( +/หรือพับ+ในอาร์เรย์ ( +/1 2 3 4== 1+2+3+4)) บนยอดหาร แต่คราวนี้ในกรณี monadic สิ่งนี้หมายความว่าที่นี่คือ J โดยอัตโนมัติ "เดา" ว่า 1 จะเป็นค่าที่มีประโยชน์มากที่สุด

ทางเรขาคณิต

(# %: */)
  • # - ความยาว (ของอาร์เรย์)
  • %:- รูท ( 4 %: 7หมายถึง 'รูทที่สี่ (หรือเทสเซอแรท) ของเจ็ด)
  • */- ผลิตภัณฑ์ ( */คล้ายกันในความหมายให้+/ดูฟังก์ชั่นก่อนหน้านี้)

คณิตศาสตร์

(+/ % #)
  • +/ - ผลรวมควรคุ้นเคยตอนนี้
  • % - หารด้วย
  • # - ความยาว

รูตหมายความว่ากำลังสอง

%:@(%@# * +/@:*:)

เอ๊ะใช่แล้ว ...

  • %: - รากของ
    • %@# - ค่าผกผันของความยาว
    • * - ไทม์
    • +/@:*:- ผลรวมของสี่เหลี่ยม ( *:คือกำลังสองแม้ว่าจะ*~เป็นเช่นกัน)

Contraharmonic

+/@:*: % +/
  • +/@:*: - ผลรวมของกำลังสอง
  • % - หารด้วย
  • +/ - ผลรวม.

จริง ๆ แล้วฉันพบว่าฟังก์ชั่นของฉันยาวเกินหนึ่งไบต์สองไบต์โดยอธิบายเรื่องนี้ดีมาก!

ถ้า J ทำได้ดีในการประมวลผลสตริงเราจะชนะการแข่งขันกอล์ฟมากขึ้น ...


นั่นคือ RegEx ใช่ไหม : P
เด็กเล็ก

@ LittleChild Nope มันเจ ( jsoftware.com )
ɐɔıʇǝɥʇuʎs

5
@ LittleChild: ดีใจที่ไม่ใช่ APL
slebetman

J ทำงานได้อย่างยอดเยี่ยมทั้งในด้านความตึงและในแผนกยิ้ม - ฉันยังพบ%) และ: @ (...
Desty

5

ภาษา: 5

POV-Ray 3.7 ฉากคำอธิบายภาษา: 304 ไบต์

#fopen I"i"read#declare S=0;#declare N=0;#declare Q=0;#declare P=1;#declare R=0;#while(defined(I))#read(I,V)#declare S=S+V;#declare N=N+1;#declare Q = Q+V*V;#declare P=P*V;#declare R=R+1/V;#end#warning concat(str(N/R,0,5),",",str(pow(P,1/N),0,5),",",str(S/N,0,5),",",str(sqrt(Q/N),0,5),",",str(Q/S,0,5))

(POV-Ray SDL ไม่มีฟังก์ชั่นอินพุตของคอนโซลดังนั้นฉันจึงทำการแทนที่ไฟล์อินพุตเอาต์พุตคือคอนโซล แต่ถูกล้อมรอบด้วยเอาต์พุตสถานะโปรแกรมจำนวนมาก)

พลเรือจัตวาพื้นฐาน: 111 104 ไบต์

1 P=1:O┐1,0
2 I/#1 V:IF V=0T|G┌4
3 S=S+V:N=N+1:Q=Q+V*V:P=P*V:R=R+1/V:G┌2
4 ?N/R,P↑(1/N),S/N,(Q/N)↑.5,Q/S

(ไม่ทั้งหมดของตัวละครในโปรแกรมนี้สามารถแสดงใน Unicode. |จะใช้เพื่อแสดงSHIFT+H, หมายถึงSHIFT+O, หมายถึงSHIFT+P, /หมายถึงSHIFT+N. เนื่องจากข้อ จำกัด ในพลเรือจัตวา I / O พื้นฐานของการป้อนข้อมูลที่ถูกป้อนหมายเลขหนึ่งในช่วงเวลาที่มีการป้อนข้อมูล ของ -1 เพื่อระบุจุดสิ้นสุดของอินพุตเอาต์พุตถูกคั่นด้วยแท็บ)

QBasic: 96 ไบต์

P=1:INPUT V:WHILE V:S=S+V:N=N+1:Q=Q+V*V:P=P*V:R=R+1/V:INPUT V:WEND:?N/R;P^(1/N);S/N;(Q/N)^.5;Q/S

ใช้รูปแบบ I / O เดียวกับรายการของ DLosc ฉันเล่นกอล์ฟ 15 ไบต์โดยใช้ข้อเท็จจริงที่INPUT Vส่งคืน 0 (ซึ่งประเมินว่าเป็นเท็จ) เมื่อบรรทัดว่างคืออินพุต (อย่างน้อยใน MS-DOS QBasic 1.1 - ฉันไม่ทราบว่ามันใช้งานได้ใน QB64)

Pascal (คอมไพเลอร์ FPC): 172 ไบต์

program M;uses math;var v,p,s,n,q,r:real; begin p:=1;while not eoln do begin read(v);s:=s+v;n:=n+1;q:=q+v*v;p:=p*v;r:=r+1/v end;write(n/r,p**(1/n),s/n,(q/n)**0.5,q/s);end.

อินพุตถูกคั่นด้วยช่องว่างไม่ใช่คอมมาและขึ้นบรรทัดใหม่ เอาต์พุตถูกคั่นด้วยช่องว่าง

Erlang: 401 ไบต์

-module(means).
-import(io).
-import(math).
-import(string).
-import(lists).
-export([means/6]).

means(S,N,Q,P,R,[]) -> io:fwrite("~f,~f,~f,~f,~f~n", [N/R,math:pow(P,(1/N)),S/N,math:sqrt(Q/N),Q/S]);
means(S,N,Q,P,R,[V|T]) -> means(S+V,N+1,Q+V*V,P*V,R+1/V,T).

means:means(0,0,0,1,0,lists:map(fun({F,R}) -> F end, lists:map(fun(X) -> string:to_float(X) end, string:tokens(io:get_line(""), ",\n")))).

การจัดการสายอักขระใน Erlang เป็นความเจ็บปวดของราชวงศ์ ดังนั้นทั้งหมดจำนวนจุดลอยตัวต้องป้อนอย่างน้อยหนึ่งหลักหลังจุดทศนิยม - string:to_float/1จะไม่แปลงแต่จะแปลง11.0

(เพิ่มเติมมาโดยเฉพาะถ้าฉันคิดวิธีการทำใน RoboTalk ภาษาที่ไม่มีการดำเนินการทศนิยมหรือ I / O)


ฉันรักพลเรือจัตวา 64
AquaAlex

Ditto ... และ amiga
MickyT

แฟน QBasic เพื่อน! ฉันทำสิ่งเดียวกันอย่างอิสระหลังจากพบว่าเราไม่ต้องจัดการกับ 0 เป็นอินพุตที่ถูกต้อง ;) ฉันเห็นว่าคุณคุ้นเคย(Q/N)^.5กับฉันSQR(q/n)แล้ว แต่นั่นไม่ส่งผลกระทบต่อความยาว บางทีเราสามารถแบ่งปันผู้นำ? (ฉันทำให้นับไบต์ 96 ไม่รวมถึงการขึ้นบรรทัดใหม่ตามรอย)
DLosc

@DLosc เคาน์เตอร์ไบต์ของฉัน ( wc) รวมถึงการขึ้นบรรทัดใหม่ต่อท้ายซึ่งผมคิดว่าจะช่วยให้เราทั้งสองนำ - INPUT Vอย่างน้อยจนกว่าฉันจะคิดออกว่าจะได้รับการกำจัดที่ซ้ำกันที่
ทำเครื่องหมาย

โชคดี. : ^) ฉันพยายามทำสิ่งที่แปลกใหม่ด้วยGOTOs แทนการวนซ้ำ แต่ไม่สามารถลดได้อีก
DLosc

5

ภาษา: 3

หากไม่มีการระบุเป็นอย่างอื่นตัวเลขจะต้องคั่นด้วยช่องว่าง

C: 181 163

ใช้ตัวเลขจนถึงจุดสิ้นสุดของอินพุต

#include<math.h>
main(){double h=0,g=1,a=0,q=0,k,n=0;for(;scanf("%lf",&k);++n)h+=1/k,g*=k,a+=k,q+=k*k;printf("%f %f %f %f %f\n",n/h,pow(g,1/n),a/n,sqrt(q/n),q/a);}

(ISO) C ++: 195

ใช้ตัวเลขจนถึงจุดสิ้นสุดของอินพุต

#include<iostream>
#include<cmath>
int main(){double h=0,g=1,a=0,q=0,k,n=0;for(;std::cin>>k;++n)h+=1/k,g*=k,a+=k,q+=k*k;std::cout<<n/h<<" "<<pow(g,1/n)<<" "<<a/n<<" "<<sqrt(q/n)<<" "<<q/a<<"\n";}

Haskell: 185 180 164 159 149 140

รับจำนวนรายการโดยพลการคั่นด้วยการขึ้นบรรทัดใหม่

การดำเนินงาน

m=map
f x=let{s=sum;n=s$m(\_->1)x;t=s$m(^2)x}in[n/s(m(1/)x),product x**(1/n),s x/n,sqrt$t/n,t/s x]
main=getLine>>=print.f.m read.words>>main

50 41 (ขอบคุณ shiona) ไบต์เป็นเพียงสำหรับ IO: /

ตัวอย่าง

( echoaka PowerShell จะWrite-Outputพิมพ์พารามิเตอร์ทุกตัวในบรรทัดเดียว)

PS> echo "1 2 3 4 5" "1.7 17.3 3.14 24 2.718 1.618" | SO.hs runhaskell
[2.18978102189781,2.605171084697352,3.0,3.3166247903554,3.6666666666666665]
[3.011834514901806,4.621794669196026,8.412666666666668,12.234139719108438,17.791525635945792]

คุณควรจะสามารถนิยามคำจำกัดความบางอย่างในคำตอบของ haskell ตัวอย่างเช่นแทนที่จะเขียน;c=t/aในข้อให้เขียนหลังจากที่[h,g,a/z,r,t/a] in
ภูมิใจ haskeller

@proudhaskeller: จุดดีขอบคุณ!
ซีตา

นอกจากนี้ยังมีการเขียนs$m(1/)xสั้นกว่าที่เป็นอยู่s.m(1/)$x s$m(^2)x
ภูมิใจ haskeller

@proudhaskeller: ขอบคุณอีกครั้ง หนึ่งอาจบอกได้ว่ารหัสค่อยๆพัฒนาจากรุ่นที่ไม่ใช่กอล์ฟ นอกจากนี้ยังถูกแทนที่ด้วยfromIntegral.length$x foldr(\_ x->x+1)0x
ซีตา

เคล็ดลับดี! s$m(const 1)xแต่ตอนนี้ที่คุณทำให้ฉันมองไปที่มันฉันพบนี้:
ภูมิใจ haskeller

4

ภาษา - 4

ฉันชอบข้ออ้างที่จะดึงความดีออกมาเสมอ

QBasic, 112 96 ไบต์

g=1:INPUT x:WHILE x:h=h+1/x:g=g*x:a=a+x:q=q+x^2:n=n+1:INPUT x:WEND:?n/h;g^(1/n);a/n;SQR(q/n);q/a

QBasic ไม่ดีกับจำนวนอินพุตตัวแปรดังนั้นโปรแกรมต้องใช้หนึ่งหมายเลขต่อบรรทัดสิ้นสุดด้วย 0 หรือบรรทัดว่าง เอาต์พุตถูกคั่นด้วยช่องว่าง

(ย่อเมื่อฉันรู้ว่า 0 ไม่ใช่หมายเลขที่ถูกต้องและสามารถใช้สำหรับการยกเลิกอินพุต)

ทดสอบโดยใช้QB64 :

การทดสอบโปรแกรม QBasic หมายถึง

เสียงกระเพื่อมสามัญ 183 ไบต์

(defun m(l)(let((a(apply #'+ l))(q(apply #'+(map'list #'(lambda(x)(* x x))l)))(n(length l)))(list(/ n(apply #'+(map'list #'/ l)))(expt(apply #'* l)(/ n))(/ a n)(sqrt(/ q n))(/ q a))))

ด้วยเหตุผลบางอย่างฉันคาดว่าสิ่งนี้จะสั้นกว่านี้ ฉันไม่ใช่ผู้เชี่ยวชาญ LISP ทุกคนดังนั้นเคล็ดลับจึงได้รับการชื่นชม เวอร์ชันที่ไม่ถูกปรับแต่ง:

(defun means (l)
  (let ((a (apply #'+ l))                                    ; sum of numbers
        (q (apply #'+ (map 'list #'(lambda (x) (* x x)) l))) ; sum of squares
        (n (length l)))
    (list                                 ; Return a list containing:
      (/ n (apply #'+ (map 'list #'/ l))) ; n over sum of inverses
      (expt (apply #'* l) (/ n))          ; product to the power of 1/n
      (/ a n)                             ; a/n
      (sqrt (/ q n))                      ; square root of q/n
      (/ q a)                             ; q/a
    )
  )
)

อาจเป็นวิธีที่ดีที่สุดในการทดสอบคือการวางฟังก์ชันลงในclispREPL เช่น:

$ clisp -q
[1]> (defun m(l)(let((a(apply #'+ l))(q(apply #'+(map'list #'(lambda(x)(* x x))l)))(n(length l)))(list(/ n(apply #'+(map'list #'/ l)))(expt(apply #'* l)(/ n))(/ a n)(sqrt(/ q n))(/ q a))))
M
[2]> (m '(1 2 3 4 5))
(300/137 2.6051712 3 3.3166249 11/3)
[3]> (m '(8.6))
(8.6 8.6 8.6 8.6 8.6)
[4]> (m '(3 123456))
(246912/41153 608.5787 123459/2 87296.58 5080461315/41153)

ฉันชอบวิธี Lisp ที่ใช้เศษส่วนที่แน่นอนแทนที่จะลอยเมื่อแบ่งจำนวนเต็มสองจำนวน

อารัมภบท, 235 ไบต์

ภาษาอารัมภบทไม่ได้ยอดเยี่ยม แต่เราจะใช้ต่อไป ทดสอบกับ SWI-Prolog ฉันคิดว่าsumlistคำกริยาอาจไม่ได้เป็นมาตรฐานการเปิดฉาก แต่ไม่ว่าฉันจะใช้อะไรก็ตาม

m(L,H,G,A,Q,C):-length(L,N),h(L,I),H is N/I,p(L,P),G is P^(1/N),sumlist(L,S),A is S/N,q(L,R),Q is sqrt(R/N),C is R/S.
p([H|T],R):-p(T,P),R is H*P.
p([],1).
q([H|T],R):-q(T,P),R is H*H+P.
q([],0).
h([H|T],R):-h(T,P),R is 1/H+P.
h([],0).

Ungolfed:

m(L, H, G, A, Q, C) :-
        length(L, N),   % stores the length into N
        h(L, I),        % stores the sum of inverses into I
        H is N/I,
        p(L, P),        % stores the product into P
        G is P^(1/N),
        sumlist(L, S),  % stores the sum into S
        A is S/N,
        q(L, R),        % stores the sum of squares into R
        Q is sqrt(R/N),
        C is R/S.

% Helper predicates:

% p calculates the product of a list
p([H|T], R) :-
        p(T, P),     % recursively get the product of the tail
        R is H*P.    % multiply that by the head
p([], 1).            % product of empty list is 1

% q calculates the sum of squares of a list
q([H|T], R) :-
        q(T, P),     % recursively get the sum of squares of the tail
        R is H*H+P.  % add that to the square of the head
q([], 0).            % sum of empty list is 0

% h calculates the sum of inverses of a list
h([H|T], R) :-
        h(T, P),     % recursively get the sum of inverses of the tail
        R is 1/H+P.  % add that to the inverse of the head
h([], 0).            % sum of empty list is 0

บน Linux ด้วยรหัสในไฟล์ชื่อmeans.proทดสอบดังนี้:

$ swipl -qs means.pro
?-  m([1,2,3,4,5],H,G,A,Q,C).
H = 2.18978102189781,
G = 2.605171084697352,
A = 3,
Q = 3.3166247903554,
C = 3.6666666666666665.

ให้ผลลัพธ์ที่ถูกต้อง แต่ค่อนข้างน่าขบขันเมื่อมีหมายเลขเดียวเท่านั้น:

 ?- m([8.6],H,G,A,Q,C).
 H = G, G = A, A = Q, Q = C, C = 8.6.

Python 3, 103 ไบต์

h=a=q=n=0;g=1
for x in eval(input()):h+=1/x;g*=x;a+=x;q+=x*x;n+=1
print(n/h,g**(1/n),a/n,(q/n)**.5,q/a)

กลยุทธ์เดียวกับรุ่น Python 2 ของ Dennis ใช้รายการตัวเลขคั่นด้วยเครื่องหมายจุลภาค จัดการทั้ง ints และลอย การป้อนข้อมูลหมายเลขเดียวจะต้องห่อด้วยเครื่องหมายวงเล็บแบบสี่เหลี่ยม (และรายการหมายเลขอาจเป็น) การแก้ไขจะมีราคา 4 ไบต์


4

8 ภาษา

Fortran 77 - 286

      READ*,l
      b1=0
      b2=1
      b3=0
      b4=0
      DO 10 i=1,l
        READ*,j
        b1=b1+1/j
        b2=b2*j
        b3=b3+j
        b4=b4+j**2
   10 CONTINUE
      h=l/b1
      g=b2**(1/l)
      a=b3/l
      q=(b4/l)**0.5
      c=b4/b3
      PRINT*,h,g,a,q,c
      END

BBC BASIC - 131

INPUT l
b=0:d=1:e=0:f=0
FOR i=1 TO l
  INPUTj:b+=1/j:d*=j:e+=j:f+=j^2
NEXT l
h=l/b:g=d^(1/l):a=e/l:q=(f/l)^0.5:c=f/e
PRINTh,g,a,q,c

เอาท์พุท:

5 
5
100
12
15
1
9.7914836236097695 26.600000000000001 45.596052460711988 78.15789473684211  

C ++ - 292

#include <iostream>
#include <cmath>
using namespace std;int main(){cout << "Length of sequence?: ";cin >> l;int b=0;int d=1;int e=0;int f=0;int j;int seq[l];for(int i=0;i<l;i++){cin >> j;b+=1/j;d*=j;e+=j;f+=pow(j,2);}
    h=l/b;g=pow(d,(1/l));a=e/l;q=pow((f/l),0.5);c=f/e;cout << h,g,a,q,c;}

Python 3 - 151

s=input().split(',');l=len(s);b=0;d=1;e=0;f=0
for i in s:i=float(i);b+=1/i;d*=i;e+=i;f+=i**2
h=l/b;g=d**(1/l);a=e/l;q=(f/l)**0.5;c=f/e
print(h,g,a,q,c)

เอาท์พุท:

5,100,12,15,1       # Input
3.6764705882352944 9.7914836236097695 26.600000000000001 45.596052460711988 78.15789473684211

Java - 421

class Sequences {
    public static void main( String[] args){
        System.out.println("Length of sequence?: ");Scanner reader = new Scanner(System.in);l=reader.nextInt();int b=0;int d=1;int e=0;int f=0;int j;int seq[l];
        for(int i=0;i<l;i++){j=reader.nextInt();b+=1/j;d*=j;e+=j;f+=Math.pow(j,2);}
        h=l/b;g=Math.pow(d,(1/l));a=e/l;q=Math.sqrt(f/l);c=f/e;System.out.println(h+' '+g +' '+ a+' '+q+' '+c);}}

Javascript - 231

ฉันไม่ใช่ Javascripter ดังนั้นคำแนะนำใด ๆ ก็จะได้รับการชื่นชมอย่างมาก

console.log("Length of sequence?: ");
var l=readline(),b=0,d=1,e=0,f=0;
for(var i = 0;i<l;i++) {var j=readline();b+=1/j;d*=j;e+=j;f+=pow(j,2);}
h=l/b;g=pow(d,(1/l));a=e/l;q=sqrt(f/l);c=f/e;
console.log(h+' '+g+' '+a+' '+q+' '+c);

อัลลอยด์ - 337

ค้นหาบนGoogle Play StoreหรือRaspberry Pi Store

text.clear();
set l=text.inputNumber("Length of sequence?: ");set b=0;set d=1;set e=0;set f=0;set seq=array{};
for(set i=1; i<=l; i++){set j=text.inputNumber(i..": ");b+=1/j;d*=j;e+=j;f+=math.pow(j,2);}
set h=l/b;set g=math.pow(d,(1/l));set a=e/l;set q=math.sqrt(f/l);set c=f/l;set str=h.." "..g.." "..a.." "..q.." "..c;text.output(str);

var'aQ - 376

สิ่งนี้ถูกต้องตามหลักไวยากรณ์และทั้งหมด แต่ล่ามปัจจุบันทั้งหมดไม่ทำงาน ...

0 ~ b cher
1 ~ d cher
0 ~ e cher
0 ~ f cher
'Ij mI'moH ~ l cher
l {
    'Ij mI'moH ~ j cher
    b 1 j wav boq ~ b cher
    d j boq'egh ~ d cher
    e j boq ~ e cher
    f j boqHa'qa boq ~ f cher
} vangqa'
l b boqHa''egh ~ h cher
d 1 l boqHa''egh boqHa'qa  ~ g cher
e l boqHa''egh ~ a cher
f l boqHa''egh loS'ar ~ q cher
f e boqHa''egh c cher
h cha'
g cha'
a cha'
q cha'
c cha'

1
คุณสามารถบันทึก 1 ตัวอักษรที่ใช้sqrt(b4/l)แทน(b4/l)**0.5และอื่น ๆ อีกมากมายโดยใช้a, b, c, แทนd b1-4คุณทำให้ฉันร้องไห้ด้วยการใช้ 77 แทน F90 + ที่ทันสมัยกว่า
Kyle Kanos

@Kyle Haha ฉันจะเริ่มเรียน F99 ตอนนี้
Beta Decay

ฉันประทับใจมากกับความจริงที่ว่าแม้หลังจากที่ได้เห็นการเขียนโปรแกรมรถไฟที่เป็นมาร์ตินคุณยังคงตัดสินใจที่จะใช้ภาษา 6 (มากขึ้น?) ... Nah แค่ล้อเล่น ฉันประทับใจผู้คนที่รู้มากกว่าสองภาษา
AndoDaan

1
ใน JS คุณสามารถใช้ประกอบการจุลภาคเพื่อหลีกเลี่ยงการทำซ้ำ:var var l=readline(),b=0,d=1,e=0,f=0;ไม่แน่ใจว่าreadlineฟังก์ชั่นคืออะไร
Oriol

1
คุณควรจะสามารถบันทึกไบต์โดยการละเว้นLength of sequence?หรืออย่างน้อยทำให้สั้นลง
nyuszika7h

3

ภาษา: 3

CJam, 58

qS%:d:A{1\/}%:+A,\/SA:*1.A,/#SA:+A,/:BSA{2#}%:+A,/:CmqSCB/

TI-Basic, 85

Input L1:{dim(L1)/sum(1/(L1),dim(L1)√prod(L1),mean(L1),√(mean(L1²)),mean(L1²)/mean(L1

Java, 457

import java.util.*;class C{public static void main(String[]s){List r=new ArrayList();double[]d=Arrays.stream(new Scanner(System.in).nextLine().split(",")).mapToDouble(Double::new).toArray();double x=0,y,z;for(double D:d){x+=1/D;}r.add(d.length/x);x=1;for(double D:d){x*=D;}r.add(Math.pow(x,1./d.length));r.add(y=Arrays.stream(d).average().getAsDouble());x=1;for(double D:d){x+=D*D;}r.add(Math.sqrt(z=x/d.length));r.add(z/y);r.forEach(System.out::println);}}

คุณสามารถเพิ่มเอาต์พุตตัวอย่างสำหรับ Java ได้หรือไม่? มีความแม่นยำทศนิยมกี่ตำแหน่งเมื่อเปรียบเทียบกับเอาต์พุตใน OP
Michael Easter

สั้นลงเล็กน้อยสำหรับ TI-BASIC คือ{dim(Ans)/sum(Ansֿ¹),dim(Ans)√(prod(Ans)),mean(Ans),√(mean(Ans²)),mean(Ans²)/mean(Ans
lirtosiast

3

ภาษา - 2

งูเห่า - 132

def f(l as number[])
    a,b,c,d=0d,1d,0d,0d
    for i in l,a,b,c,d=a+1/i,b*i,c+i,d+i**2
    print (e=l.length)/a,b**(1/e),c/e,(d/e)**0.5,d/c

Python - 129

def f(l):a,b,c=len(l),sum(i*i for i in l),sum(l);print(a/sum(1/i for i in l),eval('*'.join(map(str,l)))**(1/a),c/a,(b/a)**.5,b/c)

รุ่น Python ทำงานได้ทั้ง Python 2 และ 3 แต่โปรดทราบว่ารูปแบบผลลัพธ์ไม่เหมือนกันทุกประการ
nyuszika7h

3

1 ภาษา


R, 92 91

f=function(x){n=length(x);s=sum;d=s(x^2);c(n/s(1/x),prod(x)^(1/n),mean(x),(d/n)^.5,d/s(x))}

รับเวกเตอร์ของค่าและส่งเวกเตอร์ของค่าเฉลี่ย


คุณสามารถบันทึกตัวอักษรถ้าคุณใช้d=s(x^2)และแทนที่หลังสองใช้กับs(x^2) d
Kyle Kanos

แน่นอนขอบคุณ!
plannapus

3

1 ภาษา

Golfscript, 162

n/:@,:^;'(1.0*'@'+'*+')/'+^+'('@'*'*+')**(1.0/'+^+')'+^'/(1.0/'+@'+1.0/'*+')'+'(1.0/'^+'*('+@'**2+'*+'**2))**0.5'+'('@'**2+'*+'**2)/'+4$+'*'+^+]{'"#{'\+'}"'+~}%n*

ใช่มันใหญ่มาก และมันสามารถทำให้เล็กลงได้อย่างแน่นอน ซึ่งฉันจะทำบางครั้งในภายหลัง ลองที่นี่

คาดว่าอินพุตจะเป็นบรรทัดขึ้นบรรทัดใหม่คั่น หากไม่ได้รับอนุญาตฉันจะแก้ไข (+2 ตัวอักษร) มันออกรายการบรรทัดใหม่คั่น

นี่เป็นรุ่นที่อ่านง่ายขึ้นเล็กน้อย:

n/:@,:^;
'(1.0*'@'+'*+')/'+^+
'('@'*'*+')**(1.0/'+^+')'+
^'/(1.0/'+@'+1.0/'*+')'+
'(1.0/'^+'*('+@'**2+'*+'**2))**0.5'+
'('@'**2+'*+'**2)/'+4$+'*'+^+
]{'"#{'\+'}"'+~}%
n*

ดูเหมือนว่า Ruby มากกว่า GolfScript : P
Dennis

@Dennis มันเป็น ;-)
จัสติน

ทำไมคุณเรียงลำดับหมายถึง
เดนนิส

@ เดนนิสฉันไม่ต้องการหรือ "สะดวกผลลัพธ์จะอยู่ในลำดับที่เพิ่มขึ้น"
จัสติน

4
นั่นเป็นความคิดเห็นไม่ใช่ข้อกำหนด ค่าเฉลี่ยฮาร์มอนิกนั้นน้อยกว่าหรือเท่ากับค่าเฉลี่ยเรขาคณิตซึ่งน้อยกว่าหรือเท่ากับค่าเฉลี่ยเลขคณิตเป็นต้นโดยวิธีการที่คุณมีข้อบกพร่องในค่าเฉลี่ยของคุณ ผลลัพธ์ควรมีl*lค่าสูงขึ้นlคูณด้วยจำนวนลอย
เดนนิส

3

ภาษา 2

Fortran: 242

ฉันถอดมันออกเพื่อความชัดเจน แต่เวอร์ชั่นของกอล์ฟคือสิ่งที่นับได้ ก่อนอื่นคุณต้องป้อนจำนวนของค่าที่จะเพิ่มจากนั้นค่า

program g
   real,allocatable::x(:)
   read*,i
   allocate(x(i));read*,x
   print*,m(x)
 contains
   function m(x) result(p)
      real::x(:),p(5)
      n=size(x)
     p(1:4)=[n/sum(1/x),product(x)**(1./n),sum(x)/n,sqrt(sum(x**2)/n)]
     p(5)=p(4)**2/p(3)
   endfunction
end

wxMaxima 134

คัดลอกสิ่งนี้ลงในตัวแก้ไขctrl+enterจากนั้นโทรผ่านm([1,2,3,4,5]),numerเพื่อรับเอาต์พุตเลขทศนิยม (มิฉะนั้นคุณจะได้รับสัญลักษณ์สัญลักษณ์)

m(x):=block([n:length(x),d:0,c:mean(x)],for i:1 thru n do(g:x[i],d:d+g*g),return([1/mean(1/x),apply("*",x)^(1/n),c,sqrt(d/n),d/n/c]));

1
บางทีคุณอาจรวมเวอร์ชัน golfed เพิ่มเติมเพื่อให้ผู้คนสามารถตรวจสอบการนับได้
Paŭlo Ebermann

3

Perl, 86 76

$,=$";$h+=1/uc,$g+=log,$a+=lc,$q+=$_**2for<>;print$./$h,exp$g/$.,$a/$.,sqrt$q/$.,$q/$a

อินพุต: หนึ่งหมายเลขต่อบรรทัด

แก้ไข: นี่คือตัวละครอีกต่อไป แต่เนื่องจากเห็นได้ชัดว่าเส้น Shebang ไม่นับรวมอยู่ในนั้นจึงกลายเป็นเรื่องที่ดีกว่า:

#!perl -pl
$"+=1/uc,$,+=log,$}+=lc,$;+=$_**2}for($./$",exp$,/$.,$}/$.,sqrt$;/$.,$;/$}){

เป็นเรื่องปกติที่จะนับ Shebang ที่มีสวิตช์ที่ไม่ใช่ค่าเริ่มต้นสองค่าเป็นสองไบต์ ที่ถูกกล่าวว่าทางออกที่น่าประทับใจมาก!
เดนนิส

3

T-SQL, 136 122

ด้วยรายการตัวเลขที่เก็บไว้ในตาราง S กับ I (จำนวนเต็ม) เพื่อระบุรายการและ V (ลอย) ค่า

SELECT COUNT(*)/SUM(1/V),EXP(SUM(LOG(V))/COUNT(*)),AVG(V),SQRT((1./COUNT(*))*(SUM(V*V))),SUM(V*V)/SUM(V) FROM S GROUP BY I

SQLFiddle

บันทึกแล้ว 14 ขอบคุณ Alchymist


1
เอาชนะฉันไปกับมันในโซลูชัน SQL คุณสามารถบันทึกอักขระได้ไม่กี่ตัวใน 2 ช่วงสุดท้ายด้วย sqrt (sum (v v) / count ( )) และ sum (v * v) / sum (v) นอกจากนี้ใน Oracle SQL คุณสามารถบันทึกอักขระอื่นเป็นฟังก์ชันได้ เป็น ln แทนที่จะบันทึก
เล่นแร่แปรธาตุ

@ นักเล่นแร่แปรธาตุขอบคุณมาก Face palm :)
MickyT

3

ภาษา: 5

บางรายการพยายามหลีกเลี่ยงข้อผิดพลาดในการปัดเศษ (ถึงทศนิยม 4 ตำแหน่ง) โดยใช้ BigDecimal ของ Java แทน float / double และยอมรับกฎ IO ต่อ OP

รายการใหม่ผ่อนคลายทั้งกฎ IO และ BigDecimal

Groovy - 409 400 164 157 ตัวอักษร

float i=0,j=1,k=0,l,n=0,m=0,p;args.each{x=it as float;i+=1/x;j*=x;k+=x;m+=x*x;n++};l=k/n;p=m/n;println "${n/i},${Math.pow(j,1f/n)},$l,${Math.sqrt p},${p/l}"

วิ่งตัวอย่าง:

bash$ groovy F.groovy 10.1381 29.8481 14.7754 9.3796 44.3052 22.2936 49.5572 4.5940 39.6013 0.9602
5.957994213465398,14.304084339049883,22.545269,27.939471625408938,34.62429631138658

Java - 900 235 ตัวอักษร

class F{public static void main(String[]a){float i=0,j=1,k=0,l,n=0,m=0,p;for(String s:a){float x=Float.valueOf(s);i+=1/x;j*=x;k+=x;m+=x*x;n++;}l=k/n;p=m/n;System.out.println(n/i+","+Math.pow(j,1f/n)+","+l+","+Math.sqrt(p)+","+p/l);}}

วิ่งตัวอย่าง:

bash$ java F 10.1381 29.8481 14.7754 9.3796 44.3052 22.2936 49.5572 4.5940 39.6013 0.9602
5.957994,14.304084906138343,22.545269,27.939471625408938,34.6243

Clojure - 524 324 ตัวอักษร

(defn r[x](/ (reduce + 0.0 x)(count x)))
(defn s[x](reduce #(+ %1 (* %2 %2)) 0.0 x))
(defn f[x](let[n (* 1.0 (count x))][(/ n(reduce #(+ %1 (/ 1.0 %2)) 0.0 x))(Math/pow(reduce * x)(/ 1.0 n))(r x)(Math/sqrt(/(s x) n))(/(/(s x) n)(r x))]))
(doseq [x(f(map #(Float/valueOf %) *command-line-args*))](print(str x ",")))
(println)

ตัวอย่างการรัน (มันมีคอมม่าต่อท้ายที่ท้าย):

bash$ java -jar clojure-1.6.0.jar m2.clj 10.1381,29.8481,14.7754,9.3796,44.3052,22.2936,49.5572,4.5940,39.6013,0.9602
5.957994368133907,14.30408424976292,22.545269936323166,27.93947151073554,34.62429460831333,

สกาล่า - 841 663 230 ตัวอักษร

import java.math._
object F{def main(a:Array[String]){
var i,j,k,l,m,p=0f;var n=0
a.foreach{y=>var x=y.toFloat;i+=1/x;j*=x;k+=x;m+=x*x;n+=1}
l=k/n;p=m/n;System.out.println(n/i+","+Math.pow(j,1f/n)+","+l+","+Math.sqrt(p)+","+p/l)}}

วิ่งตัวอย่าง:

bash$ scala F.scala 10.1381 29.8481 14.7754 9.3796 44.3052 22.2936 49.5572 4.5940 39.6013 0.9602
5.957994,0.0,22.545269,27.939471625408938,34.6243

JRuby - 538 ตัวอักษร

มันไม่ชัดเจนว่า JRuby แตกต่างจาก Ruby: จะต้องทำงานกับ JVM แต่มันคือไวยากรณ์ของทับทิม ฉันรวมมันไว้ในจิตวิญญาณของหินโรเซตต้า

require 'java'
java_import 'java.math.BigDecimal'
o=BigDecimal::ONE
z=BigDecimal::ZERO
def b(s) java.math.BigDecimal.new s end
def p(x,y) java.lang.Math::pow(x.doubleValue,y.doubleValue) end
def d(x,y) x.divide y,5,BigDecimal::ROUND_UP end
def r(x,n) d(x.inject(b(0)){|a,v|a.add v},n) end
def s(x) x.inject(b(0)){|a,v|a.add(v.multiply v)} end
x=[]
ARGV[0].split(",").each{|i|x<<b(i)}
n=b x.size
puts "#{d n,x.inject(z){|a,v|a.add(d o,v)}},#{p x.inject(o){|a,v|a.multiply v},d(o,n)},#{r(x,n)},#{p d(s(x),n),b("0.5")},#{d d(s(x),n),r(x,n)}"

เรียกใช้ตัวอย่าง (พิมพ์คำเตือนไปยัง stderr):

bash$ jruby Mean.rb 10.1381,29.8481,14.7754,9.3796,44.3052,22.2936,49.5572,4.5940,39.6013,0.9602
5.95781,14.30408436301878,22.54527,27.939471541172715,34.62430


2

ภาษา - 1

Groovy:

def input = [1.7,17.3,3.14,24,2.718,1.618];
def arithmeticMean
def harmonicMean
def geometricMean
def quadraticMean
def contraharmonicMean

def sum = 0
def product = 1
// Arithmetic Mean
for(each in input){
    sum += each
}
arithmeticMean = sum / input.size()

// Harmonic Mean
sum = 0
for(each in input){
    sum += (1/each)
}
harmonicMean = input.size() / sum

// Geometric Mean
for(each in input){
    product *= each
}
geometricMean = Math.pow(product,1/input.size());

// Quadratic Mean
sum = 0
for(each in input){
    sum += (each*each)
}
quadraticMean = Math.pow(sum/input.size() ,(1/2))

// Contraharmonic Mean
sum = 0
def sum2 = 0
for( each in input ){
    sum += each
    sum2 += (each * each)
}
contraharmonicMean = (sum2/input.size()) / (sum/input.size())

println "Arithmetic Mean: $arithmeticMean"
println "Harmonic Mean: $harmonicMean"
println "Geometric Mean: $geometricMean"
println "Quadratic Mean: $quadraticMean"
println "Contraharmoic Mean: $contraharmonicMean"

5
จุดมุ่งหมายคือการเขียนรหัสที่สั้นที่สุดสำหรับแต่ละภาษาดังนั้นคุณอาจต้องการใช้ตัวระบุอักขระเดี่ยวและเว้นช่องว่างหากเป็นไปได้
ปีเตอร์เทย์เลอร์

1
@PeterTaylor โอ้ไม่เป็นไร! ไม่ทราบว่า ใหม่ที่นี่
เด็กเล็ก

@LittleChild โปรดแก้ไขรหัสของคุณให้สั้นที่สุดเท่าที่จะทำได้ อย่าลืมเขียนจำนวนตัวอักษรที่คุณใช้ที่ด้านบนของโพสต์
mbomb007

2

2 ภาษา

Java - 243 ไบต์

class M{public static void main(String[]a){float h=0,l=a.length,p=1,s=0,q=0;for(int i=0;i<l;i++){float v=Float.valueOf(a[i]);q+=v*v;s+=v;h+=1/v;p*=v;}System.out.println(l/h+"\n"+Math.pow(p,1.0/l)+"\n"+s/l+"\n"+Math.sqrt((1.0/l)*q)+"\n"+q/s);}}

ขยาย:

class Means {
    public static void main(String[] a) {
        float h = 0, l = a.length, p = 1, s = 0, q = 0;
        for (int i = 0; i < l; i++) {
            float v = Float.valueOf(a[i]);
            q += v * v;
            s += v;
            h += 1 / v;
            p *= v;
        }
        System.out.println(l / h + "\n" + Math.pow(p, 1.0 / l) + "\n" + s / l
                + "\n" + Math.sqrt((1.0 / l) * q) + "\n" + q / s);
    }
}

vba - excel, 387 ไบต์

กรอกค่าในคอลัมน์แรกจากนั้นกดปุ่ม (ที่เรียกรหัสนี้) และส่งออกค่าในคอลัมน์ที่สอง

Private Sub a_Click()
Dim d,s,q,h,p As Double
Dim y As Integer
h=0
q=0
s=0
p=1
y=1
While Not IsEmpty(Cells(y,1))
s=s+Cells(y,1)
q=q+Cells(y,1)*Cells(y,1)
h=h+1/Cells(y,1)
p=p*Cells(y,1)
y=y+1
Wend
y=y-1
Cells(1,2)=y/h
Cells(2,2)=p^(1/y)
Cells(3,2)=s/y
Cells(4,2)=((1/y)*q)^0.5
Cells(5,2)=q/s
End Sub

2

1 ภาษา

สนิม - 469

( rustc 0.11.0-pre (3851d68 2014-06-13 22:46:35 +0000))

use std::io;use std::from_str::from_str;use std::num;fn main(){loop{let a:Vec<f64>=io::stdin().read_line().ok().expect("").as_slice().split(',').map(|x|std::from_str::from_str(x.trim_chars('\n')).expect("")).collect();let n:f64=num::from_uint(a.len()).expect("");let s=a.iter().fold(0.0,|a,b|a+*b);let q=a.iter().fold(0.0,|a,b|a+*b* *b);println!("{},{},{},{},{}",n / a.iter().fold(0.0,|a,b|a+1.0/ *b),(a.iter().fold(1.0,|a,b|a**b)).powf(1.0/n),s/n,(q/n).sqrt(),q/s,);}}

เวอร์ชันที่ไม่ถูกปรับแต่ง:

use std::io;
use std::from_str::from_str;
use std::num;

fn main() {
    loop {
        let a : Vec<f64>  = io::stdin().read_line().ok().expect("").as_slice().split(',')
                               .map(|x|std::from_str::from_str(x.trim_chars('\n')).expect("")).collect();
        let n : f64 = num::from_uint(a.len()).expect("");
        let s = a.iter().fold(0.0, |a, b| a + *b);
        let q = a.iter().fold(0.0, |a, b| a + *b * *b);
        println!("{},{},{},{},{}",
                 n / a.iter().fold(0.0, |a, b| a + 1.0 / *b),
                 (a.iter().fold(1.0, |a, b| a * *b)).powf(1.0/n),
                 s / n,
                 (q / n).sqrt(),
                 q / s,
                 );
    }
}

การบดอัดรุ่น 430 ไบต์โดยไม่ต้องห่วงหรือป้อนข้อมูลสำหรับการทดสอบในplayrust :

use std::from_str::from_str;use std::num;fn main(){let a:Vec<f64>="1,2,3,4".as_slice().split(',').map(|x|std::from_str::from_str(x.trim_chars('\n')).expect("")).collect();let n:f64=num::from_uint(a.len()).expect("");let s=a.iter().fold(0.0,|a,b|a+*b);let q=a.iter().fold(0.0,|a,b|a+*b**b);println!("{},{},{},{},{}",n / a.iter().fold(0.0, |a, b| a + 1.0 / *b),(a.iter().fold(1.0, |a, b| a * *b)).powf(1.0/n),s/n,(q/n).sqrt(),q/s);}

อัพเดทสำหรับสนิมรุ่นใหม่กว่า:

Ungolfed:

use std::io;                 
fn main(){
    let mut s=String::new();
    io::stdin().read_line(&mut s);
    let a:Vec<f64>=s
        .split(',')
        .map(|x|x.trim().parse().expect(""))
        .collect();
    let n:f64=a.len() as f64;
    let s=a.iter().fold(0.0,|a,b|a+*b);
    let q=a.iter().fold(0.0,|a,b|a+*b**b);
    println!("{},{},{},{},{}",
        n / a.iter().fold(0.0, |a, b| a + 1.0 / *b),
        (a.iter().fold(1.0, |a, b| a * *b)).powf(1.0/n),s/n,
        (q/n).sqrt(),q/s);
}

Golfed (402 ไบต์):

use std::io;fn main(){ let mut s=String::new(); io::stdin().read_line(&mut s); let a:Vec<f64>=s .split(',') .map(|x|x.trim().parse().expect("")) .collect(); let n:f64=a.len() as f64; let s=a.iter().fold(0.0,|a,b|a+*b); let q=a.iter().fold(0.0,|a,b|a+*b**b); println!("{},{},{},{},{}", n / a.iter().fold(0.0, |a, b| a + 1.0 / *b), (a.iter().fold(1.0, |a, b| a * *b)).powf(1.0/n),s/n, (q/n).sqrt(),q/s);}

1

ภาษา: 4

CoffeeScript, 193

ใช้สตริงของอินพุตที่คั่นด้วยเครื่องหมายจุลภาค:

m=(q)->m=Math;q.r=q.reduce;q=q.split(',').map Number;l=q.length;x=q.r ((p,v)->(p+v)),0;y=q.r ((p,v)->(p+v*v)),0;[l/q.r(((p,v)->(p+1/v)),0),m.pow(q.r(((p,v)->(p*v)),1),1/l),x/l,m.sqrt(y/l),y/x];

JavaScript (ES5), 256

ใช้สตริงอินพุตที่คั่นด้วยเครื่องหมายคอมม่าอีกครั้ง:

function m(q){m=Math,q=q.split(',').map(Number),q.r=q.reduce,l=q.length,x=q.r(function(p, v){return p+v;},0),y=q.r(function(p,v){return p+v*v},0);return[l/q.r(function(p,v){return p+1/v},0),m.pow(q.r(function(p,v){return p*v},1),1/l),x/l,m.sqrt(y /l),y/x]}

PHP, 252

แนวคิดเดียวกัน:

<?function m($q){$r=array_reduce;$q=explode(',',$q);$l=count($q);$x=array_sum($q);$y=$r($q,function($p,$v){return $p+$v*$v;});return[$l/$r($q,function($p,$v){return $p+1/$v;}),pow($r($q,function($p,$v){return $p*$v;},1),1/$l),$x/$l,sqrt($y/$l),$y/$x];}

TypeScript, 393 *

ตั้งแต่ TypeScript เป็นชุดของ JavaScript ฉันสามารถส่งรหัสเดียวกันได้ แต่ตอนนี้ก็ยังไม่ยุติธรรมเลย นี่คือโค้ด TypeScript ที่ย่อขนาดซึ่งมีฟังก์ชันตัวแปรและพารามิเตอร์ทั้งหมดที่พิมพ์อย่างสมบูรณ์:

function m(q:String):number[]{var a:number[]=q.split(',').map(Number),l:number=a.length,x:number=a.reduce(function(p:number,v:number):number{return p+v},0),y:number=a.reduce(function(p:number,v:number):number{return p+v*v},0);return[l/a.reduce(function(p:number,v:number):number{return p+1/v},0),Math.pow(a.reduce(function(p:number,v:number):number{return p*v},1),1/l),x/l,Math.sqrt(y/l),y/x]}

อาจโกงและใช้รูปแบบนี้ได้anyเช่นกัน ... แต่คุณรู้ไหม


0

Excel - 120

ไม่แน่ใจว่านี่จะนับเป็นภาษา "การเขียนโปรแกรม" แต่คิดว่าคนทั่วไปอาจใช้สเปรดชีตสำหรับสิ่งประเภทนี้

ด้วยตัวเลขใน A2: J2

L2 (harmonic) =HARMEAN(A2:J2)
M2 (geometric) =GEOMEAN(A2:J2)
N2 (arithmetic) =AVERAGE(A2:J2)
O2 (quadratic) =SQRT(SUMSQ(A2:J2)/COUNT(A2:J2))
P2 (contraharmonic) =(SUMSQ(A2:J2)/COUNT(A2:J2))/AVERAGE(A2:J2)

2
ฉันไม่มี Excel แต่ฉันคิดว่าคุณสามารถใช้ช่วงA:Aเพื่อกำหนดเป้าหมายทั้งคอลัมน์Aได้
เดนนิส

0

VBA (Excel) - 105

a=1:for each n in i:a=a*n:b=b+1/n:c=c+n:d=d+n*n:next:x=ubound(i)+1:?x/b","a^(1/x)","c/x","(d/x)^0.5","d/c

Ungolfed:

a=1:               set a variable to 1 (for the geometric mean)
for each n in i:   loop through the list
    a=a*n:            product of the list
    b=b+1/n:          sum of inverses of the list
    c=c+n:            sum of the list
    d=d+n*n:          sum of squares of the list
next:              end loop
x=ubound(i)+1:     get the number of elements in the list
?                  prepare to print
 x/b","               harmonic = count / sum(inverses)
 a^(1/x)","           geometric = product^(1/count)
 c/x","               arithmetic = sum / count
 (d/x)^0.5","         quadratic = square root of ( sum of squares / count )
 d/c                  contraharmonic = sum of squares / sum

รหัสนี้จะต้องมีการทำงานในหน้าต่างทันทีและอาร์เรย์ต้องเรียกฉัน เนื่องจากไม่มีการรวบรวมข้อผิดพลาดไม่มีการทำความสะอาดไม่มีการปล่อย / ปล่อยตัวแปรหากคุณต้องการทดสอบโค้ดนี้คุณสามารถใช้โค้ดต่อไปนี้ (เพียงวางในหน้าต่างทันทีและรันบรรทัดตามลำดับ):

b=0:c=0:d=0:set i = nothing:i= array(1,2,3,4,5)
a=1:for each n in i:a=a*n:b=b+1/n:c=c+n:d=d+n*n:next:x=ubound(i)+1:?x/b","a^(1/x)","c/x","(d/x)^0.5","d/c

ไม่มีอะไรพิเศษมากเพียงแค่เลือกใช้หน้าต่างทันทีด้วย:เพื่อแทนที่ตัวแบ่งบรรทัดซึ่งจะช่วยประหยัดสองสามไบต์เทียบกับการตั้งค่าย่อยหรือฟังก์ชั่นแล้วปิดมัน ใช้งาน? เพื่อพิมพ์มากกว่า debug.print (เฉพาะในหน้าต่างทันที); และขึ้นอยู่กับวิธีที่ vba กำหนดค่าโดยนัย (การเพิ่มค่าให้กับตัวแปรที่ไม่ได้ตั้งค่าส่งคืนค่า) และการดำเนินการโดยนัย (ทุกอย่างที่เกี่ยวข้องกับสตริงคือการต่อข้อมูลโดยนัย)

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