So sánh mức trung bình của danh sách của tôi


18

Lấy trung bình của một danh sách (ví dụ [2,6,7])

  • Lấy độ dài của danh sách: [2,6,7] -> 3
  • Tổng các số trong danh sách : 2 + 6 + 7 = 15.
  • Chia tổng cho số của họ : 15 / 3 = 5.

Bạn nên so sánh giá trị trung bình của hai danh sách tích cực số nguyên NM , bằng cách trả lại một giá trị nếu N có cao hơn trung bình, giá trị khác nếu M có trung bình cao hơn, và một số khác trong trường hợp của một tie.


Quy tắc I / O

Tất cả các phương pháp đầu vào và đầu ra tiêu chuẩn được cho phép.

Đầu vào

Bạn có thể lấy đầu vào là hai danh sách riêng biệt, danh sách lồng nhau hoặc bất kỳ thứ gì khác mà bạn cho là phù hợp với nhiệm vụ. Vui lòng ghi rõ định dạng.

Đầu ra

Các giá trị được cung cấp phải khác biệt và phải bao gồm ít nhất một ký tự không phải khoảng trắng. Ngoài ra, chúng phải nhất quán giữa các lần chạy (một giá trị duy nhất cho N , một giá trị duy nhất cho M , một giá trị duy nhất cho Tie ). Vui lòng chỉ định những người trong câu trả lời của bạn. Các giá trị có thể là các chuỗi không trống, giá trị Bool, Số nguyên hoặc bất cứ thứ gì bạn cho là phù hợp.


Thông số kỹ thuật

  • Các danh sách sẽ không nhất thiết phải có độ dài bằng nhau.

  • Bạn được đảm bảo rằng các danh sách là không trống.


Các trường hợp thử nghiệm

Tôi đã chọn các giá trị N wins, M winsTie, điều này khá rõ ràng.

N, M -> Đầu ra (Trung bình)

[7], [6] -> N thắng (N có 7, M có 6)
[4,5], [4,4] -> N thắng (N có 4,5, M có 4)
[2,3,4], [4,5,6] -> M thắng (N có 3, M có 5)
[4,1,3], [7,3,2,1,1,2] -> Cà vạt (cả hai đều có 2.666 ...)
[100,390,1], [89,82,89] -> N thắng (N có 163.666 ..., M có 86.666 ...)
[92.892], [892,92] -> Tie (danh sách về cơ bản là giống hệt nhau) 
[10,182], [12,78.203,91] -> Cà vạt (cả hai đều có 96)

Lỗ hổng mặc định áp dụng. Giải thích được khuyến khích! Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!



nếu ngôn ngữ tôi chọn chỉ hỗ trợ số nguyên, tôi có thể lấy đầu vào nhân với 1000 không? Theo cách đó, trung bình tính được vẫn chính xác đến 3 chữ số thập phân
Skidsdev

@Mayube Có, điều đó được cho phép
Ông Xcoder

Chúng tôi phải trả lại một đầu ra ít nhất 1 ký tự. Điều đó có nghĩa là chúng tôi được yêu cầu trả lại một ký tự hoặc một chuỗi? Hay bạn có nghĩa là một đầu ra có giá trị chuỗi có ít nhất 1 ký tự?
Olivier Grégoire

@ OlivierGrégoire Đầu ra đưa ra phải dài ít nhất 1 ký tự (bạn không thể trả về một chuỗi trống, nhưng có thể trả về bất kỳ Chuỗi nào có ít nhất 1 ký tự và bất kỳ ký tự không phải khoảng trắng nào). Tuỳ bạn.
Ông Xcoder

Câu trả lời:



15

Toán học, 15 byte

Order@@Mean/@#&

Hãy thử trực tuyến!

Functiontrong đó mong đợi một danh sách của hai danh sách. Mean/@#lấy giá trị trung bình số học của từng danh sách trong đầu vào, sau đó các phương tiện đó được chuyển vào Order, trả về -1nếu danh sách đầu tiên thắng, 0nếu có hòa và 1nếu danh sách thứ hai thắng.


7

JavaScript (ES6), 52 50 byte

(Đã lưu 2 byte nhờ @Shaggy.)

Đây là hai giải pháp 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

Trả về Infinity cho N, -Infinity cho M và NaN cho cà vạt.

Giải pháp đầu tiên có thể yêu cầu một chút giải thích do đệ quy:

Trong cuộc gọi đầu tiên đến hàm, ađược khởi tạo là mức trung bình của Nmảng:

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

M có một giá trị tại điểm này, vì vậy phần đầu tiên của biểu thức điều kiện được gọi là:

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

Hàm được gọi trong biểu thức này, lần này thay thế Mcho N.

Trong cuộc gọi thứ hai này đến chức năng, ađược khởi tạo là mức trung bình của NCỗ máy Mtrong cuộc gọi trước đó.

Vì không có tham số thứ hai trong lệnh gọi hàm này, phần thứ hai của biểu thức điều kiện được kích hoạt, trả về giá trị trung bình:

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

Bây giờ chúng ta có thể hiểu biểu thức tốt hơn:

(a - f(M)) / 0

Nó là:

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

Sự khác biệt giữa các trung bình sẽ là một số dương, một số âm hoặc 0.

Chia chênh lệch cho 0 kết quả là Infinity , -Infinity hoặc NaN - cung cấp ba giá trị riêng biệt theo yêu cầu.

Các trường hợp thử nghiệm:


Bạn có thể lưu một vài byte bằng cách di chuyển Ađến các tham số hàm không?
Shaggy

5

Toán học, 21 byte

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

1 cho #chiến thắng, -1 cho #2chiến thắng, 0 cho hòa.


hoặc, dài bằng nhau,Sign[#-#2&@@Mean/@#]&
Greg Martin

5

TOÁN , 8 byte

Soooo nhiều sửa đổi ( YZ). Tôi không thể tìm ra cách để làm cho nó ngắn hơn. sum / number_of_elementslà ba byte. Nó có thể là một cách tốt hơn để làm -ZS, nhưng tôi không thể tìm thấy một.

YmiYm-ZS

Hãy thử trực tuyến!

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

Trả về 1nếu đầu vào thứ nhất lớn hơn, 0nếu chúng buộc và -1nếu đầu vào thứ hai lớn hơn.





3

Octave , 27 byte

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

Hãy thử trực tuyến!

Lấy hai vectơ x.ylàm đầu vào, lấy meancả hai vectơ và trừ đi một vectơ khác. Lấy dấu hiệu của điều này, để có được 1, 0-1cho ba lựa chọn thay thế khác nhau.



3

APL (Dyalog) , 11 byte

Nhắc cho một danh sách của hai danh sách. Bản in1 nếu bên trái có trung bình cao hơn, 0 nếu chúng có cùng mức trung bình và ¯1nếu bên phải có trung bình cao hơn.

×-/(+/÷≢)¨⎕

Hãy thử trực tuyến!

 lời nhắc

(Giáo dục  áp dụng các chức năng ngầm sau đây để mỗi:

+/ Tổng

÷ chia

 kiểm đếm

-/ chèn (và đánh giá) một điểm trừ giữa chúng

× dấu hiệu


3

Javascript, 81 66 58 56 byte

đã lưu 15 byte nhờ Luke

đã lưu 2 byte nhờ Justin Mariner

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

Tie là 0, M là 1 và N là -1. Được gọi bằng cú pháp currying, ví dụ.f([7])([6])


1
Bạn có thể cải thiện điều này bằng một vài byte: bạn có thể loại bỏ phép gán biến, bạn có thể sử dụng cú pháp cà ri, bạn có thể xóa cảnh báo và bạn có thể dễ dàng tính tổng các mảng bằng cách sử dụng eval(a.join`+`). a=>(b=a.map(c=>eval(c.join`+`)/c.length))[0]-b[1]?b[0]>b[1]:0cho 61 byte. Nó lấy đầu vào là một mảng các mảng và đầu ra 0cho một tie, truecho M và falsecho N.
Luke

Tại sao bạn không đăng nó như là câu trả lời của riêng bạn?
SuperStormer

1
Bạn có thể lưu thêm hai byte bằng cách nội tuyến hàm ( a) lần đầu tiên sử dụng : n=>m=>Math.sign((a=b=>eval(b.join`+`)/b.length)(m)-a(n)).
Justin Mariner


3

Haskell, 65 43 byte

Đã lưu 22 byte nhờ nimi!

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

Phải có một cách tốt hơn nhiều ... Nhưng các loại chuyển đổi đã làm tôi khó chịu.

Sử dụng

(#) [7] [6]

Trả về GTnếu đối số đầu tiên thắng,LT nếu đối số thứ hai thắng và EQnếu chúng kết hợp.

Hãy thử trực tuyến!


1
Không cần phải đúc sum$xvới f.. Ngoài ra: length xcó thể được thay thế bằng sum[1|_<-x], vì vậy bạn có thể thoát khỏi fhoàn toàn : a x=sum x/sum[1|_<-x].
nimi

À Thậm chí không nghĩ làm điều đó.
Henry

1
... Ồ và trong #: ...(a x)$a y.
nimi

1
... thậm chí tốt hơn: truy cập miễn phí với chức năng chính của bạn, sau đó bạn thậm chí có thể lưu tên cho nó : (.a).compare.a. Cách sử dụng : ( (.a).compare.a ) [7] [6].
nimi

2
Một điều nữa: [1|_<-x]giống như (1<$x).
nimi

3

J, 10 byte

*@-&(+/%#)

Một danh sách được đưa ra ở bên trái, một bên phải. Sẽ trả về _1 nếu trung bình bên trái nhỏ hơn, 1 nếu lớn hơn và 0 nếu chúng bằng nhau

  • (+/%#) là một ngã ba J tiêu chuẩn để tính trung bình của danh sách
  • &cung cấp một biến thể trên ngã ba dyadic. nó áp dụng phía bên phải (động từ trung bình, trong trường hợp này) cho cả hai đối số và sau đó chuyển chúng sang động từ ở phía bên trái, trong trường hợp này là ...
  • *@- trừ đi theo "dấu hiệu": vì vậy avg bên phải bị trừ từ bên trái và chúng ta được cung cấp dấu hiệu của kết quả - _1, 1 hoặc 0

3

Bình thường, 10 8 7 6 byte

Cảm ơn @isaacg đã lưu một byte

._-F.O

Đầu vào được lấy dưới dạng một danh sách lồng nhau , [N, M]. Đầu ra -1nếu N < M, 1nếu N > M0 nếu chúng bằng nhau.

Dùng thử trực tuyến


Bạn có thể lưu một byte bằng cách thay thế h.+bằng-F
isaacg

3

TI-Basic, 25 21 13 12 10 byte

-2 byte nhờ lirtosiast

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

2
Điều này có thể được đánh gôn bằng cách sử dụng Ansthay vì C: mean(L₁)>mean(L₂:Ans+3(mean(L₁)=mean(L₂, 21 byte.
Scott Milner

Bạn có thể loại bỏ ().
lirtosiast

2

Thạch , 7 byte

S÷Lµ€IṠ

Một liên kết đơn âm chấp nhận một danh sách của hai danh sách, N,Mtrả về:
[-1]for N;
[1]cho M; và
[0]cho một chiếc cà vạt.
Là một chương trình đầy đủ nó in kết quả (danh sách đơn hàng in nội dung của họ mà thôi, vì thế -1, 1hoặc 0).

Hãy thử trực tuyến!

Làm sao?

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)

Tôi biết Jelly sẽ khá giỏi trong thử thách này, tôi chỉ không biết ngôn ngữ cho lắm.
Hoàn

Tôi không chắc chắn 100% điều này là không thể, giả sử, 5 ...!
Jonathan Allan

@Jonathan Allan Tôi là ai? Về cơ bản để lấy mức trung bình bạn ánh xạ hàm trung bình, chưa phải là hàm dựng sẵn, vì vậy bạn sử dụng đối tác ngắn nhất (tôi cho là) S÷L, và sau đó bạn chuyển đổi nó thành liên kết đơn thông qua S÷¥L$đó có thể rút ngắn S÷Lµtừ đó bắt đầu chương trình và sau đó bạn đặt một quyền ở đó để lập bản đồ và sau đó vì không có nội dung nào để so sánh bạn sử dụng _/Ṡnhưng bạn có thể rút ngắn IṠvì đó vẫn là 3 đầu ra cmp khác biệt ... vâng, khá chắc chắn rằng nó không thể thực hiện trong 5. Ngoài ra 5 sẽ không giúp đỡ kể từ khi tôi FGITW'd. :)
Erik the Outgolfer

2

Perl 6 , 25 byte

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

Hãy thử trực tuyến!

Đưa ra một đối số duy nhất, một danh sách hai yếu tố của danh sách các số. Trả về 1nếu danh sách đầu tiên có mức trung bình lớn hơn, -1nếu danh sách thứ hai thực hiện và 0nếu mức trung bình bằng nhau.


2

JavaScript (ES6), 60 byte

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

Đầu ra 0cho Tie, truecho Nfalsecho M.


2

JavaScript (ES6), 60 54 byte

-6 byte nhờ @Luke và @Neil

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

Lấy đầu vào là một mảng 2 phần tử [N, M]. Kết quả đầu ra true, 0hoặc falsecho N, TiehoặcM , tương ứng.

Giải trình

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

Kiểm tra đoạn trích

Số đầu vào được phân tách bằng dấu cách / dấu phẩy.


1
Bạn có thể có thể lưu một số byte bằng cách thay thế Math.sign(y-x)bằng y-x?x>y:0. Đầu ra 0cho Tie, truecho Nfalsecho M.
Lu-ca

1
x-y&&x>ycó lẽ?
Neil

@Neil Nice, thậm chí còn tốt hơn
Justin Mariner

2

Pip , 13 byte

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

Đây là một chức năng có một danh sách các danh sách. Trả về 1nếu trung bình thứ nhất lớn hơn, -1nếu thứ hai lớn hơn, 0nếu được buộc.Chạy tất cả các trường hợp thử nghiệm ở đây.

Lý lịch

Giải pháp này sử dụng rất nhiều hai metaoperoper của Pip:

  • $, gập lại. Lấy một toán tử nhị phân và áp dụng nó giữa các yếu tố của một danh sách. Ví dụ, +là bổ sung, nhưng$+ tổng hợp một danh sách. Lưu ý rằng $làm cho một toán tử nhị phân thành một toán tử đơn nguyên.
  • *, bản đồ. Lấy một toán tử đơn nguyên và áp dụng nó cho từng thành phần của danh sách. Chẳng hạn, #đưa ra độ dài của danh sách, nhưng#* đưa ra (một danh sách) độ dài của các mục trong danh sách.
  • Hai metaoperoper này có thể được kết hợp: $+*ánh xạ gấp / cộng trên một danh sách, tổng hợp từng yếu tố của danh sách.

Một điều khác cần biết về Pip là rất nhiều nhà khai thác làm việc theo từng mục trong danh sách theo mặc định. Chẳng hạn, [1 2 3] * 5cho [5 10 15]; [1 2 3] * [2 3 4]cho đi [2 6 12]; và [[1 2] [3 4]] * [5 6]cho[[5 10] [18 24]] .

Giải trình

Chúng tôi sẽ sử dụng một ví dụ đầu vào của [[2 3 4] [2 3 4 6]]:

  • {...}
    Xác định một hàm. Đối số (đầu tiên) được liên kết với biến cục bộ a.
  • #*a
    Ánh xạ #tới đối số của hàm, lấy độ dài của danh sách con. Kết quả:[3 4]
  • a/#*a
    Chia (các yếu tố của) danh sách acon theo độ dài tương ứng của chúng. Kết quả:[[0.667 1 1.333] [0.5 0.75 1 1.5]]
  • $+*a/#*a
    Bản đồ $+(gấp trên bổ sung) vào kết quả đó, tổng hợp các danh sách phụ. Kết quả:[3 3.75]
  • $CM$+*a/#*a
    Gấp CMlại -1, đưa ra , 0hoặc 1tùy thuộc vào việc so sánh hai toán hạng của nó (như Python cmp). Kết quả: -1(vì 3nhỏ hơn 3.75).

Bạn cũng có thể xác định các hàm trong Pip bằng cách viết các biểu thức có chứa hàm nhận dạng _. Ví dụ, _*_là một hàm bình phương đối số của nó - đường cú pháp cho {a*a}và ít byte hơn. Tuy nhiên, có một lỗi trong phiên bản hiện tại của trình thông dịch ngăn không cho _làm việc với *metaoperator. Khi đã được sửa, giải pháp này có thể là 11 byte : $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;}

Vị trí sai cho C và có lẽ là câu trả lời duy nhất không cần phân chia. Ít nhất là mã được hiển thị mà không có thanh trượt.

Return 0,1,2 cho M>N, M=N, M<Ntương ứng. Đưa đầu vào như length of M, length of N, M, N.


Là lấy chiều dài làm đối số trong thông số kỹ thuật? Cắt mã đáng kể từ rất nhiều trong số này nếu nó là.
Henry

Tôi không biết có cách nào khác để C lấy chiều dài của một mảng không. Bản thân độ dài giống như một phần nội tại của mảng.
Keyu Gan

2

Brachylog , 8 byte

⟨+/l⟩ᵐ-ṡ

Hãy thử trực tuyến!

Đầu ra 1nếu danh sách đầu tiên có mức trung bình lớn hơn, -1thì danh sách thứ hai có mức trung bình lớn hơn và 0nếu chúng được gắn.

Giải trình

     ᵐ        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 có một danh sách lồng nhau, theo đầu vào cho phép.

Truyền trực tuyến danh sách các danh sách, chuyển đổi cả hai thành trung bình của chúng, sau đó trả về dấu hiệu của sự khác biệt. 1nếu danh sách thứ nhất lớn hơn, -1nếu danh sách thứ hai lớn hơn,0 đối với cà vạt.


Vì "bất cứ điều gì cũng có thể là đầu vào", chỉ cần sử dụng Streamtrực tiếp, như tôi đã làm .
Olivier Grégoire

2

R 38 34 byte

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

Hàm lấy đầu vào là hai vectơ số. Trả về 1 nếu trung bình danh sách thứ nhất cao hơn, 0 nếu chúng giống nhau và -1 nếu trung bình danh sách thứ hai cao hơn.


1
Đây có phải là một chức năng ẩn danh có thể được gọi mà không cần gán? Tôi không biết R nhưng nếu đó là bạn không cần f=.
Phù thủy lúa mì

@WheatWizard bạn đúng; Ngoài ra, bạn có thể loại bỏ {}khỏi cơ thể chức năng.
Giuseppe

Cảm ơn các đầu vào. Đây là nỗ lực đầu tiên của tôi tại codegolf.
zelite

2

MATL , 6 byte

Đừng có ý nghĩa như vậy! *

!-ssZS

Thứ tự ngăn xếp đầu vào:

M
N

Đầu ra:

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

Hãy thử trực tuyến!

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

* Câu trả lời này đã được chơi golf mà không có ý nghĩa với bất kỳ số nghèo, không phòng thủ.


2

Java (OpenJDK 8) , 76 62 byte

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

Hãy thử trực tuyến!

Vì đầu vào có thể là bất cứ thứ gì, tôi quyết định lấy IntStreams làm đầu vào. Bạn có thể nhận được một đầu vào như vậy từ một tiêu chuẩn int[]với Arrays.stream(array).

Đầu ra là 1cho "N thắng", -1cho "M thắng" và 0cho hòa.

Tiết kiệm

  • -14 byte từ thông tin chi tiết của cả @Zener và @Xanderhall!

Cách bạn đã chọn để nhận đầu vào thực sự thông minh!
David Conrad

1
@DavidConrad Tôi thực sự đã có phiên bản dài của câu trả lời này kể từ ngày hôm qua (chỉ cần trả trước java.util.Arrays.stream(array).map(java.util.Arrays::stream)). Chỉ đến khi tôi đọc lại câu hỏi ngày hôm nay, tôi mới nghĩ định dạng đầu vào này là hợp lệ như bất kỳ.
Olivier Grégoire

1
Sẽ .orElse(0)là một rút ngắn khả thi .getAsDouble()?
Zircon

1
Thay vào đó, nếu bạn chỉ lấy 2 luồng cho đầu vào, (a,b)->Math.signum(a.average().orElse(0)-b.average().orElse(0));là 64 byte
Xanderhall

Đây chỉ là những ý tưởng tốt, các bạn! Tiếp tục: p
Olivier Grégoire

1

APL Dyalog, 14 byte

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

1nếu bên trái lớn hơn, ¯1nếu bên phải và 0trên cà vạt.

Làm sao?

¨∘⊢ cho mỗi danh sách

+/÷≢tính trung bình ( +/tổng ÷chia cho chiều dài)

-/ trừ trung bình

× dấu hiệu của kết quả


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.