Bandingkan rata-rata daftar saya


18

Mendapatkan rata-rata daftar (mis. [2,6,7])

  • Dapatkan panjang daftar: [2,6,7] -> 3
  • Jumlahkan angka-angka dalam daftar: 2 + 6 + 7 = 15.
  • Membagi jumlah dengan jumlah mereka: 15 / 3 = 5.

Anda harus membandingkan rata-rata dari dua daftar bilangan bulat positif N dan M , dengan mengembalikan nilai jika N memiliki rata-rata yang lebih tinggi, nilai lain jika M memiliki rata-rata yang lebih tinggi, dan yang lain dalam kasus dasi.


Aturan I / O

Semua metode Input dan Output standar diperbolehkan.

Memasukkan

Anda dapat mengambil input sebagai dua daftar terpisah, daftar bersarang, atau apa pun yang Anda anggap cocok untuk tugas tersebut. Silakan tentukan formatnya.

Keluaran

Nilai-nilai yang diberikan harus berbeda dan harus terdiri dari setidaknya satu karakter non-spasi putih. Juga, mereka harus konsisten antara berjalan (nilai tunggal untuk N , nilai tunggal untuk M , nilai tunggal untuk Tie ). Silakan tentukan yang ada di jawaban Anda. Nilai-nilainya bisa berupa String tidak kosong, nilai Bool, Integer, atau apa pun yang Anda anggap cocok.


Spesifikasi

  • Daftar tidak harus memiliki panjang yang sama.

  • Anda dijamin bahwa daftar ini tidak kosong.


Uji Kasus

Saya memilih nilai-nilai N wins, M winsdan Tie, yang cukup jelas.

N, M -> Output (Rata-Rata)

[7], [6] -> N menang (N memiliki 7, M memiliki 6)
[4,5], [4,4] -> N menang (N memiliki 4,5, M memiliki 4)
[2,3,4], [4,5,6] -> M menang (N memiliki 3, M memiliki 5)
[4,1,3], [7,3,2,1,1,2] -> Tie (keduanya memiliki 2,666 ...)
[100,390,1], [89,82,89] -> N menang (N memiliki 163,666 ..., M memiliki 86,666 ...)
[92.892], [892.92] -> Dasi (daftar pada dasarnya identik) 
[10.182], [12,78.203,91] -> Tie (keduanya memiliki 96)

Berlaku celah default . Penjelasan didorong! Ini adalah , jadi kode terpendek dalam byte menang!



jika bahasa pilihan saya hanya mendukung bilangan bulat, dapatkah saya mengambil input dikalikan 1000? Dengan begitu rata-rata yang dihitung masih akan akurat hingga 3 tempat desimal
Skidsdev

@ Mayube Ya, itu diizinkan
Tn. Xcoder

Kami harus mengembalikan output minimal 1 karakter. Apakah itu berarti kita harus mengembalikan karakter atau string? Atau maksud Anda output yang nilai string-nya minimal 1 karakter?
Olivier Grégoire

@ OlivierGrégoire Output yang diberikan harus sepanjang minimal 1 karakter (Anda tidak dapat mengembalikan string kosong, tetapi dapat mengembalikan setiap String minimal 1 karakter, dan juga karakter non-spasi putih). Terserah kamu.
Tn. Xcoder

Jawaban:



15

Mathematica, 15 byte

Order@@Mean/@#&

Cobalah online!

Functionyang mengharapkan daftar dua daftar. Mean/@#mengambil rata-rata aritmatika dari masing-masing daftar dalam input, lalu berarti itu diteruskan Order, yang kembali -1jika daftar pertama menang, 0jika ada seri, dan 1jika daftar kedua menang.


7

JavaScript (ES6), 52 50 byte

(Disimpan 2 byte berkat @Shaggy.)

Berikut adalah dua solusi 50-byte:

f=(N,M,a=eval(N.join`+`)/N.length)=>M?(a-f(M))/0:a

(N,M,A=a=>eval(a.join`+`)/a.length)=>(A(N)-A(M))/0

Mengembalikan Infinity untuk N, -Infinity untuk M, dan NaN untuk dasi.

Solusi pertama mungkin memerlukan sedikit penjelasan karena rekursi:

Pada panggilan pertama ke fungsi, adiinisialisasi sebagai rata-rata Narray:

a=eval(N.join`+`)/N.length

M memiliki nilai pada titik ini, jadi bagian pertama dari ekspresi kondisional disebut:

M ? (a-f(M))/0 : a  ----------    

Fungsi ini disebut dalam ungkapan ini, kali ini menggantikan Muntuk N.

Pada panggilan kedua ke fungsi ini, adiinisialisasi sebagai rata-rata N–– yang ada Mdalam panggilan sebelumnya.

Karena tidak ada parameter kedua selama panggilan ini ke fungsi, bagian kedua dari ekspresi kondisional dipicu, yang mengembalikan rata-rata:

M ? (a-f(M))/0 : a  --

Kita sekarang dapat memahami ungkapan dengan lebih baik:

(a - f(M)) / 0

Nya:

(the average of N  minus  the average of M) divided by 0

Perbedaan antara rata-rata akan menjadi angka positif, angka negatif, atau 0.

Membagi perbedaan dengan 0 hasil di Infinity , -Infinity , atau NaN - memberikan tiga nilai berbeda sesuai kebutuhan.

Kasus uji:


Bisakah Anda menyimpan beberapa byte dengan pindah Ake parameter fungsi?
Shaggy

5

Mathematica, 21 byte

Sign[Mean@#-Mean@#2]&

1 untuk #menang, -1 untuk #2menang, 0 untuk dasi.


atau, sama-sama panjang,Sign[#-#2&@@Mean/@#]&
Greg Martin

5

MATL , 8 byte

Soooo banyak pengubah ( Ydan Z). Saya tidak dapat menemukan cara untuk membuatnya lebih pendek. sum / number_of_elementsadalah tiga byte. Mungkin ini cara yang lebih baik untuk dilakukan -ZS, tetapi saya tidak dapat menemukannya.

YmiYm-ZS

Cobalah online!

           % Take first input implicitly
Ym         % Mean of that input
  i        % Grab second input
   Ym      % Mean of that input
     -     % Subtract
      ZS   % Sign

Mengembalikan 1jika input pertama lebih besar, 0jika mereka ikat, dan -1jika input kedua lebih besar.


5

05AB1E , 9 byte

1 jika Mmenang, -1 jika Nmenang dan 0 untuk seri.

vyOyg/}.S

Cobalah online!

Penjelasan

v           # for each y in list of lists
 yO         # sum y
   yg       # get length of y
     /      # divide
      }     # end loop
       .S   # compare

5

Julia , 27 byte

(x,y)->cmp(mean(x),mean(y))

Cobalah online!

Mengembalikan 1jika rata-rata pertama lebih besar, -1jika yang kedua adalah, dan 0jika mereka mengikat.



3

Oktaf , 27 byte

@(x,y)sign(mean(x)-mean(y))

Cobalah online!

Mengambil dua vektor x.ysebagai input, mengambil meankedua vektor, dan kurangi satu dari yang lain. Dapatkan tandanya, untuk mendapatkan 1, 0dan -1untuk tiga alternatif berbeda.



3

APL (Dyalog) , 11 byte

Meminta daftar dua daftar. Mencetak 1jika kiri memiliki rata-rata lebih tinggi, 0 jika mereka memiliki rata-rata yang sama, dan ¯1jika kanan memiliki rata-rata yang lebih tinggi.

×-/(+/÷≢)¨⎕

Cobalah online!

 cepat

(...  terapkan fungsi tersembunyi berikut untuk masing-masing:

+/ jumlah

÷ dibagi dengan

 penghitungan

-/ masukkan (dan evaluasi) nilai minus di antara keduanya

× signum


3

Javascript, 81 66 58 56 byte

menyimpan 15 byte berkat Luke

disimpan 2 byte berkat Justin Mariner

n=>m=>Math.sign((a=b=>eval(b.join`+`)/b.length)(m)-a(n))

Dasi adalah 0, M adalah 1 dan N adalah -1. Disebut menggunakan sintaks currying, mis.f([7])([6])


1
Anda dapat meningkatkan ini dengan beberapa byte: Anda dapat menghapus tugas variabel, Anda dapat menggunakan sintaks curry, Anda dapat menghapus peringatan, dan Anda dapat dengan mudah menjumlahkan array dengan menggunakan eval(a.join`+`). a=>(b=a.map(c=>eval(c.join`+`)/c.length))[0]-b[1]?b[0]>b[1]:0untuk 61 byte. Dibutuhkan input sebagai array array, dan output 0untuk seri, trueuntuk M dan falseuntuk N.
Luke

mengapa Anda tidak mempostingnya sebagai jawaban Anda sendiri?
SuperStormer

1
Anda bisa menghemat dua byte lainnya inlining fungsi ( a) pertama kali digunakan: n=>m=>Math.sign((a=b=>eval(b.join`+`)/b.length)(m)-a(n)).
Justin Mariner


3

Haskell, 65 43 Bytes

Disimpan 22 byte berkat nimi!

a x=sum x/sum[1|_<-x] 
x#y=compare(a x)$a y

Pasti ada cara yang lebih baik ... Tapi konversi jenis mengacaukan saya.

Pemakaian

(#) [7] [6]

Kembali GTjika argumen pertama menang, LTjika argumen kedua menang, dan EQjika mereka mengikat.

Cobalah online!


1
Tidak perlu cor sum$xdengan f.. Juga: length xbisa diganti dengan sum[1|_<-x], sehingga Anda dapat menyingkirkan off fsepenuhnya: a x=sum x/sum[1|_<-x].
nimi

Ah bagus! Bahkan tidak berpikir untuk melakukan itu.
Henry

1
... oh dan di #: ...(a x)$a y.
nimi

1
... bahkan lebih baik: pergi pointfree dengan fungsi utama Anda, maka Anda bahkan dapat menyimpan nama untuk itu: (.a).compare.a. Penggunaan: ( (.a).compare.a ) [7] [6].
nimi

2
Satu lagi: [1|_<-x]sama dengan (1<$x).
nimi

3

J, 10 byte

*@-&(+/%#)

Satu daftar diberikan di sebelah kiri, satu di sebelah kanan. Akan mengembalikan _1 jika rata-rata kiri lebih kecil, 1 jika lebih besar, dan 0 jika mereka sama

  • (+/%#) adalah garpu J standar untuk menghitung rata-rata daftar
  • &memberikan variasi pada garpu diad. itu berlaku sisi kanan (kata kerja rata-rata, dalam hal ini) untuk kedua argumen, dan kemudian meneruskannya ke kata kerja di sisi kiri, yang dalam hal ini adalah ...
  • *@- kurangi diikuti dengan "tanda": jadi rata-rata kanan dikurangkan dari kiri, dan kami diberi tanda hasilnya - _1, 1, atau 0

3

Pyth, 10 8 7 6 byte

Terima kasih @isaacg untuk menyimpan byte

._-F.O

Input diambil sebagai daftar bersarang [N, M],. Keluaran -1jika N < M, 1jika N > Mdan 0jika mereka sama.

Cobalah secara Online


Anda dapat menyimpan byte dengan menggantinya h.+dengan-F
isaacg

3

TI-Basic, 25 21 13 12 10 byte

-2 byte terima kasih kepada lirtosiast

:tanh(ᴇ9mean(L₁-mean(L₂

2
Hal ini dapat golfed dengan menggunakan Ansbukannya C: mean(L₁)>mean(L₂:Ans+3(mean(L₁)=mean(L₂, 21 byte.
Scott Milner

Anda dapat menghapus (dan ).
lirtosiast

2

Jelly , 7 byte

S÷Lµ€IṠ

Tautan monadik yang menerima daftar dari dua daftar, N,Myang mengembalikan:
[-1]untuk N;
[1]untuk M; dan
[0]untuk dasi.
Sebagai program penuh mencetak hasilnya (daftar item tunggal mencetak konten mereka saja, jadi -1, 1atau 0).

Cobalah online!

Bagaimana?

S÷Lµ€IṠ - Link: list of lists, [N,M]
   µ€   - perform the chain to the left for €ach (of N, M)
S       -   sum
  L     -   length
 ÷      -   divide (yields the average)
     I  - incremental differences (yields [avg(M) - avg(N)])
      Ṡ - sign (yields: [1] if avg(M)>avg(N); [-1] if avg(N)>avg(M); or [0] if equal)

Saya tahu Jelly akan cukup bagus dalam tantangan ini, saya hanya tidak tahu bahasanya dengan baik.
Selamat

Saya tidak 100% yakin ini tidak mungkin di, katakanlah, 5 ...!
Jonathan Allan

@ Jonathan. Allan saya? Pada dasarnya untuk mendapatkan rata-rata Anda memetakan fungsi rata-rata, yang belum merupakan builtin, jadi Anda menggunakan rekanan terpendek (saya kira) S÷L,, dan kemudian Anda mengonversinya menjadi tautan tunggal S÷¥L$yang dapat disingkat S÷Lµkarena berada pada sangat awal dari program dan kemudian Anda meletakkan di sana untuk memetakan dan kemudian karena tidak ada builtin untuk membandingkan Anda akan menggunakan _/Ṡtetapi Anda dapat mempersingkat IṠkarena itu masih 3 output cmp yang berbeda ... ya, cukup yakin itu tidak bisa dilakukan pada 5. Juga 5 tidak akan membantu karena saya FGITW'd. :)
Erik the Outgolfer

2

Perl 6 , 25 byte

{sign [-] .map:{.sum/$_}}

Cobalah online!

Membawa argumen tunggal, daftar elemen dua angka daftar. Mengembalikan 1jika daftar pertama memiliki rata-rata yang lebih besar, -1jika daftar kedua, dan 0jika rata-rata sama.


2

JavaScript (ES6), 60 byte

a=>(b=(c=a.map(d=>eval(d.join`+`)/d.length))[0])-c[1])?b>0:0

Output 0untuk Tie, trueuntuk Ndan falseuntuk M.


2

JavaScript (ES6), 60 54 byte

-6 byte terima kasih kepada @Luke dan @Neil

(i,[x,y]=i.map(v=>eval(v.join`+`)/v.length))=>y-x&&x>y

Mengambil input sebagai array 2 elemen [N, M]. Output true, 0atau falseuntuk N, Tieatau Mmasing-masing.

Penjelasan

(i,                 // input array: [N, M]
    [x,y] =         // destructure assignment: set x and y to...
    i.map(v=>       // the input values mapped as...
        eval(v.join`+`) // the sum, by joining the array with +
        / v.length      // divided by the length
    )
) => y-x && x>y     // return 0 for tie, or the result of avg(N) > avg(M)

Cuplikan Tes

Masukkan angka yang dipisahkan oleh spasi / koma.


1
Anda mungkin dapat menyimpan beberapa byte dengan menggantinya Math.sign(y-x)dengan y-x?x>y:0. Output 0untuk Tie, trueuntuk Ndan falseuntuk M.
Lukas

1
x-y&&x>ymungkin?
Neil

@Neil Nice, bahkan lebih baik
Justin Mariner

2

Pip , 13 byte

{$CM$+*a/#*a}

Ini adalah fungsi yang mengambil daftar daftar. Mengembalikan 1jika rata-rata pertama lebih besar, -1jika yang kedua lebih besar, 0jika diikat. Jalankan semua test case di sini.

Latar Belakang

Solusi ini banyak menggunakan dua metaoperator Pip:

  • $, lipat. Ambil operator biner dan terapkan di antara elemen daftar. Misalnya, +adalah tambahan, tetapi $+merangkum daftar. Catatan yang $membuat operator biner menjadi operator unary.
  • *, peta. Ambil operator unary dan terapkan pada setiap elemen daftar. Misalnya, #berikan panjang daftar, tetapi #*berikan (daftar) panjang item daftar itu.
  • Dua metaoperator ini dapat digabungkan: $+*peta dilipat / ditambah di atas daftar, menjumlahkan setiap elemen daftar.

Hal lain yang perlu diketahui tentang Pip adalah bahwa banyak operator bekerja secara bijak pada daftar secara default. Misalnya, [1 2 3] * 5memberi [5 10 15]; [1 2 3] * [2 3 4]memberi [2 6 12]; dan [[1 2] [3 4]] * [5 6]memberi [[5 10] [18 24]].

Penjelasan

Kami akan menggunakan input contoh [[2 3 4] [2 3 4 6]]:

  • {...}
    Menentukan fungsi. Argumen (pertama) terikat ke variabel lokal a.
  • #*a
    Peta #ke argumen fungsi, dapatkan panjang sublists. Hasil:[3 4]
  • a/#*a
    Bagilah (elemen-elemen) sublist adengan panjang masing-masing. Hasil:[[0.667 1 1.333] [0.5 0.75 1 1.5]]
  • $+*a/#*a
    Peta $+(lipat tambahan) ke hasil itu, menjumlahkan sublists. Hasil:[3 3.75]
  • $CM$+*a/#*a
    Lipat CM, yang memberi -1,, 0atau 1tergantung pada perbandingan dua operan (seperti Python cmp). Hasil: -1(karena 3lebih kecil dari 3.75).

Anda juga bisa mendefinisikan fungsi dalam Pip dengan menulis ekspresi yang mengandung fungsi identitas _. Sebagai contoh, _*_adalah fungsi yang kuadratkan argumennya - gula sintaksis untuk {a*a}, dan lebih sedikit byte. Namun, ada bug dalam versi penerjemah saat ini yang mencegah _bekerja dengan *metaoperator. Setelah itu tetap, solusi ini bisa menjadi 11 bytes : $CM$+*_/#*_.


2

C (gcc), 91 98 byte

u,v,j;f(x,y,a,b)int*a,*b;{for(u=v=0;x--;u+=a[x])for(j=0;j<y;)v+=b[j++];j=u*y-v;x=j>0?2:!j;}

Tempat yang salah untuk C dan mungkin satu-satunya jawaban yang tidak perlu pembagian. Setidaknya kode ditampilkan tanpa slider.

Kembali 0,1,2 untuk M>N, M=N, M<Nmasing-masing. Mengambil input sebagai length of M, length of N, M, N.


Apakah mengambil panjang sebagai argumen dalam spesifikasi? Memotong kode signifikan dari banyak ini jika ada.
Henry

Saya tidak tahu apakah ada cara lain bagi C untuk mengambil panjang array. Panjangnya sendiri lebih seperti bagian intrinsik dari array.
Keyu Gan

2

Brachylog , 8 byte

⟨+/l⟩ᵐ-ṡ

Cobalah online!

Keluaran 1 jika daftar pertama memiliki rata-rata lebih besar, -1adalah daftar kedua memiliki rata-rata lebih besar, dan 0jika mereka terikat.

Penjelasan

     ᵐ        Map:
⟨   ⟩           Fork:
 +                Sum…
  /               …divided by…
   l              …length
       -      Subtract
        ṡ     Sign

2

Java, 105 byte

s->s.stream().map(l->l.stream().reduce((i,j)->i+j).get()/l.size()).reduce((i,j)->Math.signum(i-j)).get();

Lambda yang mengambil daftar bersarang, sesuai input yang diijinkan.

Mengalirkan daftar daftar, mengubah keduanya menjadi rata-rata, lalu mengembalikan tanda perbedaan. 1jika daftar pertama lebih besar, -1jika daftar kedua lebih besar, 0untuk seri.


Karena "apa pun bisa menjadi input", gunakan Streams secara langsung, seperti yang saya lakukan .
Olivier Grégoire

2

R 38 34 byte

function(a,b)sign(mean(a)-mean(b))

Fungsi itu sebagai input dua vektor numerik. Mengembalikan 1 jika rata-rata daftar pertama lebih tinggi, 0 jika mereka sama dan -1 jika rata-rata daftar kedua lebih tinggi.


1
Apakah ini fungsi anonim yang bisa dipanggil tanpa penugasan? Saya tidak tahu R tetapi jika itu Anda tidak perlu f=.
Wheat Wizard

@WheatWizard Anda benar; selain itu Anda dapat menghapus {}dari fungsi tubuh.
Giuseppe

Terima kasih atas masukannya. Ini upaya pertama saya di codegolf.
zelite

2

MATL , 6 byte

Jangan terlalu kejam! *

!-ssZS

Urutan tumpukan input:

M
N

Keluaran:

 1 = N wins  
-1 = M wins  
 0 = tie

Cobalah online!

!-ssZS
========
!           % transpose M
 -          % N - M^T using elementwise subtraction and implicit expansion
  s         % sum columns of the result
   s        % sum the resulting row vector
    ZS      % sign of the sum

* Jawaban ini golf tanpa bermaksud jahat, angka yang tidak berdaya.


2

Java (OpenJDK 8) , 76 62 byte

a->b->Math.signum(a.average().orElse(0)-b.average().orElse(0))

Cobalah online!

Karena input bisa berupa apa saja, saya memutuskan untuk mengambil IntStreams sebagai input. Anda bisa mendapatkan input seperti itu dari standar int[]dengan Arrays.stream(array).

Output 1untuk "N menang", -1untuk "M menang", dan 0untuk dasi.

Menghemat

  • -14 byte dari wawasan @Zircon dan @Xanderhall!

Cara Anda memilih untuk mengambil input benar-benar pintar!
David Conrad

1
@ Davidvidon Saya benar-benar memiliki versi panjang dari jawaban ini sejak kemarin (hanya prepend java.util.Arrays.stream(array).map(java.util.Arrays::stream)). Hanya ketika saya membaca kembali pertanyaan hari ini, saya pikir format input ini sama validnya dengan yang lainnya.
Olivier Grégoire

1
Apakah .orElse(0)pemendekan yang layak .getAsDouble()?
Zircon

1
Jika Anda hanya mengambil 2 stream untuk input, (a,b)->Math.signum(a.average().orElse(0)-b.average().orElse(0));adalah 64 byte
Xanderhall

Ini hanya ide bagus, teman! Lanjutkan: p
Olivier Grégoire

1

Dyalog APL, 14 byte

×(-/(+/÷≢)¨∘⊢)

1jika yang kiri lebih besar, ¯1jika yang kanan dan yang 0di ikat.

Bagaimana?

¨∘⊢ untuk setiap daftar

+/÷≢ menghitung rata-rata (+/ jumlah ÷dibagi dengan panjang)

-/ kurangi rata-rata

× tanda hasilnya


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.