Rosetta Stone Challenge: Apa Saja yang Rata-Rata?


38

Tujuan dari Rosetta Stone Challenge adalah menulis solusi dalam sebanyak mungkin bahasa. Pamerkan multibahasa Anda dalam pemrograman!

Tantangan

Ketika orang menggunakan istilah "rata-rata," mereka umumnya berarti rata-rata aritmatika, yang merupakan jumlah dari angka-angka dibagi dengan jumlah angka. Namun, ada lebih banyak makna pada kata "mean," termasuk rata- rata harmonik , rata - rata geometris , rata - rata aritmatika , rata - rata kuadratik , dan rata- rata kontraharmonik .

Tantangan Anda adalah menulis program yang memasukkan daftar angka dan menampilkan 5 cara yang berbeda. Selain itu, Anda mencoba menulis program dalam bahasa sebanyak mungkin . Anda diizinkan untuk menggunakan segala jenis fungsi perpustakaan standar yang dimiliki bahasa Anda, karena ini sebagian besar adalah karya bahasa.

Memasukkan

Input akan menjadi daftar angka positif.

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

Keluaran

Output akan menjadi lima cara dalam urutan yang tercantum di atas (harmonik, geometris, aritmatika, kuadratik, kontraharmonik). Mudahnya, ini sama dengan meningkatnya pesanan.

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

Akan ada beberapa keringanan wajar dalam format I / O, tetapi saya ingin beberapa tempat desimal akurasi. Karena saya ingin output floating-point, Anda dapat mengasumsikan input floating-point.

Kriteria Kemenangan yang Objektif

Adapun kriteria kemenangan yang objektif, ini dia: Setiap bahasa adalah kompetisi terpisah untuk siapa yang dapat menulis entri terpendek, tetapi pemenang keseluruhan adalah orang yang memenangkan sebagian besar sub-kompetisi ini. Ini berarti bahwa seseorang yang menjawab dalam banyak bahasa yang tidak biasa dapat memperoleh keuntungan. Code-golf sebagian besar tiebreak ketika ada lebih dari satu solusi dalam bahasa: orang dengan program terpendek mendapat pujian untuk bahasa itu.

Jika ada seri, pemenangnya adalah orang dengan kiriman peringkat kedua (dan seterusnya).

Aturan, Batasan, dan Catatan

Program Anda dapat ditulis dalam bahasa apa pun yang ada sebelum 2 September 2014. Saya juga harus bergantung pada komunitas untuk memvalidasi beberapa tanggapan yang ditulis dalam beberapa bahasa yang lebih jarang / esoterik, karena saya tidak mungkin dapat menguji mereka.

Harap simpan semua kiriman berbeda Anda yang terkandung dalam satu jawaban.

Juga, tidak ada shenanigans dengan jawaban yang pada dasarnya sama dalam dialek bahasa yang sedikit berbeda. Saya akan menjadi juri untuk pengajuan apa yang cukup berbeda.


Papan Peringkat Saat Ini

Bagian ini akan diperbarui secara berkala untuk menunjukkan jumlah bahasa dan siapa yang memimpin di masing-masing bahasa.

  • Algoid (337) - Peluruhan Beta
  • APL (42) - algoritme hiu
  • Awk (78) - Dennis
  • BBC BASIC (155) - Peluruhan Beta
  • C (136) - Dennis
  • C ++ (195) - Zeta
  • C # (197) - Martin Büttner
  • CJam (43) - Dennis
  • Clojure (324) - Michael Easter
  • Cobra (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) - Peluruhan Beta
  • GNU bc (78) - Dennis
  • GolfScript (83) - Dennis
  • Groovy (157) - Michael Easter
  • Haskell (140) - Zeta
  • J (28) - algoritme hiu
  • Jawa (235) - Michael Easter
  • JavaScript (ES6) (112) - Dennis
  • JRuby (538) - Michael Easter
  • Julia (79) - Martin Büttner
  • Lua (113) - AndoDaan
  • Mathematica (65) - Martin Büttner
  • Matlab (63) - Martin Büttner
  • Oktaf (68) - Dennis
  • Openscript (849?) - COTO
  • Pascal (172) - Mark
  • Perl (76) - Grimy
  • PHP (135) - Dennis
  • POV-Ray 3.7 (304) - Tandai
  • Prolog (235) - DLosc
  • Pyth (52) - Dennis
  • Python 2 (96) - Dennis
  • Python 3 (103) - DLosc
  • Q (53) - algoritme hiu
  • Q'Nial (68) - algorithmshark
  • QBasic (96) - DLosc
  • R (91) - plannapus
  • Ruby (118) - Martin Büttner
  • Rust (469) - Vi.
  • Scala (230) - Michael Easter
  • T-SQL (122) - MickyT
  • TI-Basic (85) - Ypnypn
  • TypeScript (393) - rink.attendant.6
  • VBA (Excel) (387) - Stretch Maniac
  • wxMaxima (134) - Kyle Kanos

Peringkat Pengguna Saat Ini

  1. Dennis (10)
  2. Martin Büttner (6)
  3. Michael Easter (5)
  4. Tandai, DLosc, algoritme hiu (4)
  5. Beta Decay (3)
  6. Zeta, Kyle Kanos (2)
  7. Ourous, AndoDaan, COTO, Grimy, plannapus, Vi., MickyT, Ypnypn, rink.attendant.6, Stretch Maniac (1)

(Jika saya membuat kesalahan dalam peringkat di atas, beri tahu saya dan saya akan memperbaikinya. Juga, tiebreak belum diterapkan.)


Ketika Anda mengatakan Anda toleran pada I / O, apakah itu berarti fungsi juga diperbolehkan, atau apakah semuanya harus menjadi program (sejauh gagasan itu masuk akal dalam beberapa bahasa)?
Martin Ender

Anda melewatkan maksud favorit saya: mean logaritmik (a-b)/ln(a/b). Saya akui bahwa baru hari ini saya mengetahui bagaimana generalisasi pada kumpulan sampel lebih dari dua :-) en.wikipedia.org/wiki/Logarithmic_mean
Level River St

1
2 September, eh?
amalloy

1
Juga - ketika datang ke perintah built in Linux, apakah Anda menganggap bc, awkdll menjadi "bahasa" atau "perintah" - jadi apakah cara yang berbeda untuk mengimplementasikan ini dari shell dihitung pada bahasa yang berbeda?
Floris

Jawaban:


22

Bahasa: 1

Openscript (banyak ratusan)

(Favorit saya tidak jelas dan bahasa pemrograman mati dengan sedih, karena saya belajar memprogramnya bertahun-tahun yang lalu;)

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 Saya sudah menyukai bahasa ini.
DLosc

2
Sintaksnya mengingatkan saya pada Chef .
Comintern

2
Sintaksnya mengingatkan saya pada COBOL.
Amadan

3
Untuk bahasa yang tampak lebih alami (dan spesifik penggunaan), lihat Inform 7.
Beska

3
inform 7 adalah bahasa nyata - hanya saja I / O adalah petualangan teks. Orang-orang telah menulis mesin catur di dalamnya dan jalur terpendek Dijkstra adalah di: en.literateprograms.org/Dijkstra's_algorithm_(Inform_7)
Jerry Jeremiah

18

Bahasa: 13

Saya pikir daftar ini sekarang harus berisi setiap bahasa pemrograman yang saya tahu cukup baik untuk menyelesaikan setidaknya masalah sederhana. Saya akan mencoba untuk membuat daftar ini lengkap dari waktu ke waktu ketika saya melihat ke dalam beberapa bahasa baru. (Saya dulu kenal beberapa Smalltalk dan Delphi, tapi saya harus mencari banyak untuk menambahkannya agar terasa benar.)

C, 196 190 171 165 byte

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

Membaca input sebagai argumen baris perintah individual dan menulis daftar sarana yang dipisahkan koma ke STDOUT.

Terima kasih atas beberapa peningkatan pada Quentin.

C ++, 200 byte

Ini sama dengan kode C di atas, ditambah dua termasuk. Saya memasukkan ini karena ini lebih panjang daripada pengiriman C ++ yang menang, jadi saya kira tidak ada salahnya dilakukan, dan saya ingin posting ini benar-benar berisi setiap bahasa yang saya tahu. :)

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

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

Menentukan fungsi dalam kelas mengambil Listganda dan mengembalikan array ganda dengan lima cara.

Terima kasih atas beberapa peningkatan pada Visual Melon dan Bob.

CJam, 52 byte

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

Mengambil input sebagai argumen baris perintah dan mencetak daftar dengan lima nilai ke STDOUT.

CoffeeScript, 155 byte

Ini hampir sama dengan solusi JavaScript lebih jauh ke bawah (dan awalnya saya tidak menghitungnya karena alasan itu), tetapi OP tetap memasukkannya ke dalam papan skor, jadi saya mempromosikannya ke pengiriman penuh. Mereka adalah bahasa yang secara teknis berbeda.

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 byte

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

Menentukan fungsi mengambil array angka dan mengembalikan array dengan lima cara.

Terima kasih atas beberapa peningkatan pada William Barbosa.

Julia, 79 byte

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

Menentukan fungsi mengambil daftar angka dan mengembalikan daftar dengan lima cara.

Lua, 120 byte

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

Menentukan fungsi dengan mengambil daftar angka dan mengembalikan 5 nilai terpisah untuk rata-rata.

Mathematica, 73 67 65 byte

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

Menentukan fungsi mengambil daftar angka floating point dan mengembalikan daftar dengan lima cara.

Fakta menyenangkan: Mathematica memiliki semua 5 cara bawaan (dan itu adalah kiriman asli saya), tetapi tiga di antaranya dapat diimplementasikan dalam karakter yang lebih sedikit daripada nama fungsi mereka.

Matlab, 65 63 byte

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

Meminta input sebagai array angka dari pengguna dan menampilkan lima cara secara individual.

Terima kasih atas beberapa peningkatan pada Dennis Jaheruddin.

PHP ≥ 5.4, 152 149 143 byte

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

Implementasi fungsional yang sama dengan yang sebelumnya.

Terima kasih atas beberapa peningkatan pada Ismael Miguel.

Python 2, 127 byte

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]

Implementasi fungsional yang sama dengan yang sebelumnya.

Ruby, 129 118 byte

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

Implementasi fungsional yang sama dengan yang sebelumnya.


Saya menyadari ini cukup setelah fakta, tetapi Anda dapat kehilangan 3 byte Julia dengan menggunakan norm(l)/n^.5menggantikan norm(l)/sqrt(n).
Alex A.

13

4 bahasa

J - 32 28 char!

Fungsi mengambil daftar angka sebagai satu-satunya argumen.

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

a di sini adalah kata keterangan, yang mengambil fungsi orde kedua.

  • +/ % # adalah kereta di J, yang berarti Sum Divided-by Count, definisi rata-rata aritmatika.
  • &.:adalah konjungsi yang disebut Under, di mana u&.:v(y)setara dengan vi(u(v(y)))dan viadalah kebalikan fungsional v. Ya, J dapat mengambil invers fungsional .
  • Akhirnya, fitur J yang berguna adalah bahwa fungsi-fungsi tertentu dapat secara otomatis mengulang daftar, karena J tahu untuk menerapkannya secara langsung jika tidak masuk akal untuk menerapkannya pada seluruh argumen. Jadi kuadrat daftar adalah daftar kotak, misalnya.

Jadi amengambil fungsi di sebelah kiri, dan mengembalikan rata-rata yang "menyesuaikan" nilai dengan fungsi, mengambil rata-rata aritmatika, dan kemudian membalikkan penyesuaian setelahnya.

  • %aadalah rata-rata harmonik, karena %berarti Timbal Balik, dan merupakan kebalikannya sendiri.
  • ^.aadalah rata-rata geometris, karena ^.logaritma natural dan kebalikannya adalah eksponensial.(Π x)^(1/n) = exp(Σ log(x)/n)
  • [aadalah mean aritmatika, karena [merupakan fungsi identitas.
  • *:aadalah rata-rata kuadratik, karena *:Kuadrat, dan kebalikannya adalah akar kuadrat.
  • Contraharmonic memberi kita banyak masalah — rata-rata kuadrat dibagi dengan mean — jadi kita melakukan sedikit matematika untuk mendapatkannya: ( *:adibagi dengan ( [adibagi dengan *:a)). Ini seperti [a(]%%)*:a. Sementara kita berada di sana, kita menambahkan setiap cara [a(,,]*%~)*:a,.

Terakhir, kami menggunakan koma untuk menambahkan sisa hasil secara bersamaan. Kami tidak memerlukan parens lebih lanjut karena rangkaian adalah (dalam hal ini setidaknya) asosiatif.

Digunakan di 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

Q - 53 char

Fungsi argumen tunggal. Kami hanya membuat daftar semua cara yang kami inginkan.

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

Hal yang sama di versi k yang lain ada di bawah.

  • k4, 51 char: {s:(a:avg)x*x;(%a@%x;exp a log x;a x;sqrt s;s%a x)}
  • k2, 54 char: {s:(a:{(+/x)%#x})x*x;(%a@%x;(*/x)^%#x;a x;s^.5;s%a x)}

APL - 42 char

Fungsi mengambil daftar sebagai argumen.

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

Dijelaskan oleh ledakan:

{                                         } ⍝ 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 char

Anda akan menyukai yang ini.

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

Q'Nial adalah bahasa berorientasi array lain, sebuah implementasi dari Nial , yang didasarkan pada Teori Array yang tidak jelas dengan cara yang sama seperti yang dilakukan Haskell berdasarkan teori kategori. (Dapatkan di sini .) Ini sangat berbeda dari tiga lainnya - ia mem-parsing kiri-ke-kanan, pertama-tama! —Tapi itu masih lebih terkait dengan mereka daripada dengan bahasa lain mana pun.


Saya tahu ada cara yang lebih baik untuk melakukan ini di APL. Jadi saya bisa menghormati variabel yang saya definisikan dengan benar ; tidak akan memikirkan itu sendiri ... - Kode J itu mengesankan! Setiap kali saya melihat salah satu jawaban Anda, saya berkata pada diri sendiri Anda harus belajar bahasa itu. , tetapi kemudian saya mulai membaca beberapa dokumentasi / tutorial dan tiba-tiba saya tidak tahu apakah saya berada di kelas bahasa Inggris atau di stasiun kereta ...: P
Dennis

@ Dennis Ya, tugas APL / J / K mengembalikan nilai (sebagian besar waktu!). Dan terimakasih. :) Ketika mempelajari J, itu bisa mulai membingungkan tentang apa yang sesuai dengan bagian bahasa rumah Anda, jadi Iverson pada dasarnya melarang kata-F (fungsi) ketika menulis dokumen untuk mencoba memaksa Anda untuk mulai segar. Berguling dengan itu dan muncul dengan analogi Anda sendiri nanti adalah cara termudah untuk melakukannya.
algorithmshark

Saya masih mempertahankan APL sejauh ini merupakan bahasa array yang paling mudah dibaca. Begitu banyak untuk snarks "tulis saja"! Sayang sekali, GNU APL tidak mendukung sintaksis modern apa pun (bersarang D-funs, pelingkupan leksikal, pengembalian bersyarat, kait dan kereta api ... ya ampun, tersedak /⍨) Itu mungkin dimaksudkan untuk porting kode yang benar-benar lama. Apa yang kamu gunakan? Dyalog? NARS2000? Saya pikir sangat disayangkan J mengambil pendekatan kebisingan ASCII. Implementasi bahasa itu merupakan karya jenius. Tetapi saya tidak dapat diganggu untuk menguraikan mental]a(,,]*%~)*:a
Tobia

@Tobia Saya sebentar menggunakan Dyalog, tapi saya sebenarnya hampir tidak tahu cukup APL untuk bertahan. Saya seorang penggemar J / K terutama karena ASCII portabel, dan model peringkat lebih masuk akal daripada APL. ( [0.5]? Ew.) Dengan latihan, Anda terbiasa diam-diam J, meskipun. Jauh lebih buruk dari ini.
algorithmshark

12

12 bahasa


CJam, 45 44 43 byte

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

Membaca array pelampung (misalnya, [1.0 2.0 3.0 4.0 5.0]) dari STDIN. Cobalah online.


APL, 67 61 53 52 50 byte

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

Cobalah online.


Pyth, 55 52 byte

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

Membaca angka yang dipisahkan ruang (mis., 1 2 3 4 5) Dari STDIN.


Oktaf, 68 byte

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

Belum termasuk shebang. Membaca array (mis., [1 2 3 4 5]) Dari STDIN.


GNU bc, 78 byte

#!/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

Menghitung shebang sebagai 1 byte ( -lswitch). Membaca spasi mengambang terpisah dari STDIN, diikuti oleh nol.


Awk, 78 byte

#!/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}

Belum termasuk shebang. Membaca satu angka per baris dari STDIN.


GolfScript, 86 83 byte

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

GolfScript tidak memiliki dukungan bawaan untuk mengapung, sehingga kode menguraikannya. Oleh karena itu, format input agak terbatas: Anda harus memasukkan 1.0dan 0.1bukan 1, 1.atau.1 .

Membaca pelampung (seperti yang dijelaskan di atas) satu demi satu, dari STDIN. Cobalah online.


Perl, 90 85 byte

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

Menghitung shebang sebagai 1 byte ( -nswitch). Membaca satu angka per baris dari STDIN.


Python 2, 102 96 byte

#!/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

Belum termasuk shebang. Membaca daftar pelampung (mis., 1.0,2.0,3.0,4.0,5.0) Dari STDIN.


ECMAScript 6 (JavaScript), 114 112 byte

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

Belum termasuk LF. Mengharapkan array (misalnya, [1,2,3,4,5]) sebagai argumen.


PHP, 135 (atau 108?) Byte

#!/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]);

Tidak termasuk shebang atau LF. Membaca mengapung sebagai argumen baris perintah.

Saya punya solusi yang lebih pendek, tetapi saya tidak tahu bagaimana cara menghitung byte:

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]);'

Menghitung byte di setiap string kode dan menambahkan dua untuk -Rdan -E, pendekatan ini akan skor 108.


C, 172 140 139 137 136 byte

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

Belum termasuk LF. Kompilasi dengan gcc -lm. Membaca mengapung terpisah dipisahkan dari STDIN.


Anda dapat menyimpan satu byte dalam C: while(cond)...,n++;vsfor(;cond;n++)...;
Zeta

Apakah kita benar-benar perlu memasukkan garis shebang dalam perhitungan kita?
OregonTrail

@OregonTrail: Saya sudah memasukkan shebangs dalam kode karena lebih mudah daripada menjelaskan jalankan iniinterpreter switches script untuk setiap pengiriman. Konvensi adalah bahwa garis shebang tidak dihitung, kecuali jika berisi sakelar non-default. Seperti yang dinyatakan dalam jawaban saya, saya sudah dihitung #!/usr/bin/awk -fsebagai nol byte ( -fberarti membaca program dari file), tetapi #!/usr/bin/perl -nsebagai satu byte ( -nberarti beralih di atas jalur input).
Dennis

Bukankah Anda seharusnya menghitung -quntuk Oktaf dan -lmC?
nyuszika7h

-qhanya untuk menenangkan output. -lmdibutuhkan oleh GCC. Kompiler lain mungkin tidak memerlukannya.
Dennis

6

J (50):

Ini adalah hal yang sangat baik untuk J:

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

Seperti biasa: ledakan di pabrik yang tersenyum. Namun, beberapa smiley dibiarkan utuh kali ini: :)dan :*:(itu pria dengan empat mata dan permata tertanam di wajahnya) Sesi interaktif saya yang digunakan untuk membuat ini: http://pastebin.com/gk0ksn2b

Beraksi:

   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

Penjelasan:

Seperti yang mungkin Anda harapkan, sebenarnya ada 5 fungsi yang dibundel ke dalam daftar dengan kereta garpu dan kait. (Jangan khawatir, itu hanya cara mudah untuk membuat beberapa fungsi keluaran ke satu daftar).

Baris yang saya gunakan untuk membuat J menghasilkan jawaban ini mungkin sedikit lebih jelas:

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

Mari kita melihatnya secara terpisah.

Harmonis

(# % +/@:%)
  • # - Panjang (dari array)
  • % - Dibagi dengan
  • +/@:%- Jumlah ( +/, atau lipat +dalam array ( +/1 2 3 4== 1+2+3+4)) di atas bagi, tetapi kali ini dalam kasus monadik. Apa artinya ini di sini, adalah bahwa J secara otomatis "menebak" bahwa 1 akan menjadi nilai yang paling berguna.

Geometris

(# %: */)
  • # - Panjang (dari array)
  • %:- Root ( 4 %: 7artinya 'root ke empat (atau tesseract) dari tujuh)
  • */- Produk ( */mirip artinya +/, lihat fungsi sebelumnya untuk ini)

Hitung

(+/ % #)
  • +/ - sum, seharusnya sudah tidak asing lagi sekarang
  • % - dibagi dengan
  • # - Panjang

Root berarti kuadrat

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

Ehm, ya ...

  • %: - Akar
    • %@# - Kebalikan dari panjang
    • * - Waktu
    • +/@:*:- Jumlah kuadrat ( *:kuadrat, meskipun *~juga.)

Contraharmonic

+/@:*: % +/
  • +/@:*: - Jumlah kuadrat
  • % - dibagi dengan
  • +/ - jumlah.

Saya sebenarnya mengetahui bahwa fungsi saya terlalu lama satu byte dua byte dengan menjelaskan ini, jadi itu bagus!

Jika J hanya sebagus ini dalam memproses string, kita akan memenangkan lebih banyak kompetisi golf ...


Apakah itu RegEx ?? : P
Little Child

@LittleChild Tidak. It's J. ( jsoftware.com )
2ıʇǝɥʇuʎ

5
@LittleChild: Bersenang-senang itu bukan APL
slebetman

J tentu saja melakukan pekerjaan yang baik di kedua kesempitan dan di departemen smiley - Saya juga menemukan%) dan: @ (...
Desty

5

Bahasa: 5

POV-Ray 3.7 Adegan Keterangan Bahasa: 304 bytes

#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 tidak memiliki fungsi input konsol, jadi saya telah mengganti input file. Output untuk konsol, tetapi dikelilingi oleh banyak output status program.)

Commodore BASIC: 111 104 bytes

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

(Tidak semua karakter dalam program ini dapat direpresentasikan dalam Unicode. | Digunakan untuk mewakili SHIFT+H, mewakili SHIFT+O, mewakili SHIFT+P, /mewakili SHIFT+N. Karena keterbatasan dalam Commodore Basic I / O, input dimasukkan satu angka pada satu waktu, dengan input -1 untuk menunjukkan akhir input. Output dibatasi-tab.)

QBasic: 96 byte

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

Menggunakan skema I / O yang sama dengan entri DLosc; Saya melepas 15 byte dengan menggunakan fakta yang INPUT Vmengembalikan 0 (yang bernilai false) ketika sebuah baris kosong dimasukkan (setidaknya dalam MS-DOS QBasic 1.1 - Saya tidak tahu apakah itu juga berfungsi di QB64).

Pascal (FPC compiler): 172 byte

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.

Input dipisahkan oleh spasi, bukan koma, dan diakhiri baris baru. Output dipisahkan oleh ruang.

Erlang: 401 byte

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

Penanganan tali di Erlang adalah rasa sakit kerajaan. Akibatnya, semua angka floating-point harus dimasukkan dengan setidaknya satu digit setelah titik desimal -string:to_float/1 tidak akan dikonversi 1, tetapi akan dikonversi1.0 .

(Lebih banyak yang akan datang, terutama jika saya mencari cara untuk melakukan ini di RoboTalk, bahasa yang tidak memiliki operasi floating-point atau I / O)


Saya menyukai Commodore 64
AquaAlex

Ditto ... dan amiga
MickyT

Penggemar sesama QBasic! Saya mandiri muncul dengan hal yang sama setelah menyadari bahwa kami tidak perlu menangani 0 sebagai input yang valid. ;) Saya melihat Anda sudah terbiasa (Q/N)^.5dengan saya SQR(q/n), tapi itu tidak mempengaruhi panjangnya. Mungkin kita bisa berbagi petunjuk? (Saya membuat jumlah byte 96, tidak termasuk baris baru.)
DLosc

@Dosc, Penghitung byte saya ( wc) menyertakan baris baru, yang saya kira memberi kita keduanya petunjuk - setidaknya sampai saya mencari cara untuk menyingkirkan duplikat itu INPUT V.
Markus

Semoga berhasil. : ^) Saya mencoba beberapa barang mewah dengan GOTOs bukan loop, tetapi tidak bisa mendapatkan pengurangan lebih lanjut.
DLosc

5

Bahasa: 3

Kecuali disebutkan sebaliknya, angka harus dipisahkan oleh ruang.

C: 181 163

Membawa angka hingga akhir input.

#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

Membawa angka hingga akhir input.

#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

Membawa banyak daftar angka yang dipisahkan dengan baris baru secara sewenang-wenang.

Pelaksanaan

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 (terima kasih shiona) byte hanya untuk IO: /.

Contoh

(Powershell's echoalias Write-Outputmencetak setiap parameter pada satu baris)

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

Anda harus dapat menguraikan beberapa definisi dalam jawaban haskell. misalnya, alih-alih menulis ;c=t/adalam klausa let, tulis [h,g,a/z,r,t/a]setelah in.
haskeller bangga

@proudhaskeller: Poin bagus, terima kasih!
Zeta

juga, menulis s$m(1/)xlebih pendek dari s.m(1/)$xapa adanya s$m(^2)x.
haskeller bangga

@proudhaskeller: Sekali lagi terima kasih. Orang mungkin dapat mengatakan bahwa kode tersebut secara bertahap berevolusi dari versi non-golf. Juga diganti fromIntegral.length$xdengan foldr(\_ x->x+1)0x.
Zeta

trik yang bagus! tapi sekarang bahwa Anda membuat saya melihat itu, saya menemukan ini: s$m(const 1)x.
haskeller bangga

4

Bahasa - 4

Saya selalu suka alasan untuk menarik keluar tua yang baik

QBasic, 112 96 byte

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 tidak bagus dengan jumlah input variabel, jadi program ini membutuhkan satu nomor per baris, diakhiri dengan 0 atau baris kosong. Output dipisahkan dengan spasi.

(Dipersingkat begitu saya menyadari bahwa 0 bukan angka yang valid dan dapat digunakan untuk penghentian input.)

Diuji menggunakan QB64 :

Menguji program sarana QBasic

Gangguan Umum, 183 byte

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

Untuk beberapa alasan saya berharap ini lebih pendek. Saya bukan jenis ahli Lisp, jadi tips sangat dihargai. Versi tidak disatukan:

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

Mungkin cara terbaik untuk menguji adalah dengan menempelkan fungsi ke dalam clispREPL, seperti:

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

Saya suka bagaimana Lisp menggunakan fraksi yang tepat daripada mengapung saat membagi dua bilangan bulat.

Prolog, 235 byte

Prolog tidak hebat dalam matematika, tapi kita tetap akan menggunakannya. Diuji dengan SWI-Prolog. Saya pikir sumlistpredikatnya mungkin bukan Prolog standar, tapi apa pun, saya menggunakannya.

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

Tidak Disatukan:

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

Di Linux, dengan kode dalam file bernama means.pro, uji seperti ini:

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

Memberikan hasil yang benar tetapi lucu ketika hanya ada satu nomor:

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

Python 3, 103 byte

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)

Strategi yang sama seperti versi Dennis's Python 2. Mengambil daftar angka yang dipisah koma; menangani int dan float. Input nomor tunggal harus dibungkus dengan kurung siku (dan daftar angka selalu mungkin ); perbaikan akan menelan biaya 4 byte.


4

8 Bahasa

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

Keluaran:

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)

Keluaran:

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

Jawa - 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

Saya bukan Javascripter sehingga tips apa pun akan sangat dihargai

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

Algoid - 337

Cari di Google Play Store atau 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

Secara sintaksis ini benar dan semuanya, tetapi semua penerjemah saat ini tidak berfungsi ...

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
Anda dapat menyimpan 1 karakter menggunakan sqrt(b4/l)bukannya (b4/l)**0.5dan banyak lagi dengan menggunakan a, b, c, dbukan b1-4. Anda juga membuat saya menangis dengan menggunakan 77 bukannya F90 + yang lebih modern.
Kyle Kanos

@Kyle Haha, aku akan mulai belajar F99
Beta Decay

Saya lebih terkesan dengan fakta bahwa bahkan setelah melihat kereta pemrograman yang adalah Martin, Anda masih memutuskan untuk menggunakan 6 (lebih?) Bahasa ... Nah, hanya bercanda. Saya paling terkesan oleh orang-orang yang tahu lebih dari beberapa bahasa.
AndoDaan

1
Di JS, Anda dapat menggunakan operator koma untuk menghindari pengulangan var: var l=readline(),b=0,d=1,e=0,f=0;. Namun, tidak yakin apa readlinefungsinya.
Oriol

1
Anda harus dapat menyimpan beberapa byte dengan menghilangkan Length of sequence?atau setidaknya membuatnya lebih pendek.
nyuszika7h

3

Bahasa: 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

Jawa, 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);}}

Bisakah Anda menambahkan sampel output untuk Java? Berapa banyak tempat desimal akurasi yang diberikannya dibandingkan dengan output di OP?
Michael Easter

Sepele lebih pendek untuk TI-BASIC adalah{dim(Ans)/sum(Ansֿ¹),dim(Ans)√(prod(Ans)),mean(Ans),√(mean(Ans²)),mean(Ans²)/mean(Ans
lirtosiast

3

Bahasa - 2

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

Versi Python bekerja di kedua Python 2 dan 3, tetapi perhatikan bahwa format output tidak persis sama.
nyuszika7h

3

1 bahasa


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

Mengambil vektor nilai dan mengeluarkan vektor nilai.


Anda dapat menyimpan karakter jika Anda menggunakan d=s(x^2)dan mengganti dua penggunaan s(x^2)dengan yang terakhir d.
Kyle Kanos

Memang terima kasih!
plannapus

3

1 Bahasa

Golfscript, 162

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

Ya, sangat besar. Dan itu pasti bisa dibuat lebih kecil. Yang akan saya lakukan beberapa waktu kemudian. Cobalah di sini .

Diharapkan input dipisahkan baris baru. Jika itu tidak diizinkan, saya akan memperbaikinya (+2 karakter). Ini mengeluarkan daftar baris baru yang dipisahkan.

Ini versi yang sedikit lebih mudah dibaca:

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

Sepertinya lebih banyak Ruby daripada GolfScript. : P
Dennis

@ Dennis Ini. ;-)
Justin

Mengapa Anda menyortir sarana?
Dennis

@ Dennis saya tidak perlu? "Dengan nyaman, hasilnya akan meningkat."
Justin

4
Itu komentar, bukan keharusan. Rata-rata harmonik kurang atau sama dengan rata-rata geometris, yang kurang atau sama dengan rata-rata aritmatika, dll. Omong-omong, Anda memiliki bug dalam mean kontraharmonik Anda. Hasilnya harus l*lkali lebih tinggi, di mana ljumlah pelampung.
Dennis

3

Bahasa 2

Fortran: 242

Saya ungolfed itu untuk kejelasan, tetapi versi golf adalah apa yang dihitung. pertama-tama Anda harus memasukkan jumlah nilai yang akan ditambahkan, kemudian nilai-nilai tersebut.

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

Salin ini ke editor, ctrl+enterdan panggil via m([1,2,3,4,5]),numeruntuk mendapatkan output floating point (jika tidak, Anda mendapatkan output simbolik).

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
Mungkin Anda juga bisa memasukkan versi golf, jadi orang-orang dapat memeriksa hitungannya?
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

Input: satu nomor per baris.

EDIT: ini adalah satu karakter lebih panjang, tetapi karena garis shebang tampaknya tidak dihitung terhadap total, akhirnya menjadi lebih baik:

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

Merupakan kebiasaan untuk menghitung shebang yang berisi dua sakelar non-default sebagai dua byte. Itu dikatakan, solusi yang sangat mengesankan!
Dennis

3

T-SQL, 136 122

Dengan daftar nomor disimpan dalam tabel S dengan I (integer) mengidentifikasi daftar dan V (float) nilainya.

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

Disimpan 14 berkat Alchymist


1
Kalahkan saya untuk itu pada solusi SQL. Anda dapat menyimpan beberapa karakter pada 2 terakhir dengan sqrt (sum (v v) / count ( )) dan sum (v * v) / sum (v) Juga, di Oracle SQL, Anda dapat menyimpan karakter lain sebagai fungsi ln bukan log.
Alchymist

@Alymymist Terima kasih banyak. Face palm :)
MickyT

3

Bahasa: 5

Beberapa entri berusaha untuk menghindari kesalahan pembulatan (ke 4 tempat desimal), menggunakan BigDecimal Java bukannya float / double, dan menerima aturan IO per OP.

Entri yang lebih baru mengendurkan aturan IO dan BigDecimal.

Groovy - 409 400 164 157 karakter

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

contoh dijalankan:

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

Jawa - 900 235 karakter

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

contoh dijalankan:

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 karakter

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

menjalankan sampel (memiliki tanda koma di akhir):

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,

Scala - 841 663 230 karakter

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

contoh dijalankan:

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 karakter

Tidak jelas apakah JRuby berbeda dari Ruby: ini harus dijalankan pada JVM. Namun itu adalah sintaksis Ruby. Either way, saya memasukkannya ke dalam semangat Rosetta Stone.

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)}"

menjalankan sampel (mencetak peringatan ke 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

Bahasa 1

lua - 113

e=arg s=#e h,g,a,r=0,1,0,0 for i=1,s do x=e[i]h=h+1/x g=g*x a=a+x/s r=r+x^2/s end print(s/h,g^(1/s),a,r^.5,r/a)

2

Bahasa - 1

Asyik:

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
Tujuannya adalah untuk menulis kode sesingkat mungkin untuk setiap bahasa, jadi Anda mungkin ingin menggunakan pengidentifikasi satu karakter dan menghilangkan spasi putih jika mungkin.
Peter Taylor

1
@PeterTaylor Oh, oke! Tidak tahu itu. Baru disini.
Anak Kecil

@LittleChild Jangan ragu untuk mengedit kode Anda sesingkat mungkin. Jangan lupa untuk menulis jumlah karakter yang Anda gunakan di bagian atas posting Anda.
mbomb007

2

2 Bahasa

Java - 243 byte

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

diperluas:

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 byte

Isi nilai-nilai di kolom pertama, lalu tekan tombol (yang memicu kode ini) dan menghasilkan nilai-nilai di kolom kedua.

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 bahasa

Karat - 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,);}}

Versi tidak disatukan:

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

Versi 430 byte yang dipadatkan tanpa loop atau input, untuk pengujian dalam 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);}

Diperbarui untuk Rust yang lebih baru:

Tidak Disatukan:

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

Golf (402 bytes):

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

Bahasa: 4

CoffeeScript, 193

Mengambil string input yang dipisahkan koma:

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

Sekali lagi, ambil string input yang dipisahkan koma:

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

Konsep yang sama:

<?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 *

Karena TypeScript adalah superset JavaScript, saya bisa saja mengirimkan kode yang sama tetapi itu tidak benar-benar adil sekarang. Berikut adalah kode TypeScript yang diperkecil dengan semua fungsi, variabel, dan parameter yang diketik sepenuhnya:

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

Bisa menipu dan menggunakan tipenya anyjuga ... tapi, Anda tahu.


0

Excel - 120

Tidak yakin apakah ini dianggap sebagai bahasa "pemrograman", tetapi orang berpikir mungkin benar-benar menggunakan spreadsheet untuk hal semacam ini

Dengan angka dalam 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
Saya tidak punya Excel, tapi saya pikir Anda bisa menggunakan rentang A:Auntuk menargetkan seluruh kolom A.
Dennis

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

Tidak Terkumpul:

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

Kode ini harus dijalankan di jendela langsung, dan array harus dipanggil i . Karena tidak ada koleksi kesalahan, tidak ada pembersihan, tidak ada variabel menjatuhkan / melepaskan, jika Anda ingin menguji kode ini Anda dapat menggunakan potongan kode berikut (cukup tempel di jendela langsung dan jalankan baris dalam urutan):

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

Tidak ada yang sangat istimewa, hanya pilihan untuk menggunakan jendela langsung dengan : untuk mengganti jeda baris, yang menghemat beberapa byte vs menyiapkan sub atau fungsi dan menutupnya; menggunakan? untuk mencetak daripada debug.print (hanya di jendela langsung); dan mengandalkan bagaimana vba menentukan nilai implisit (menambahkan nilai ke variabel yang tidak disetel mengembalikan nilai) dan operasi implisit (apa pun yang melibatkan string adalah rangkuman implisit).

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.