Trung bình ra hai danh sách


11

Trung bình ra hai danh sách

Thử thách

Đưa ra hai danh sách các số nguyên dương, xác định xem có thể sắp xếp lại các phần tử thành hai danh sách mới sao cho các danh sách mới có cùng giá trị trung bình số học (trung bình).

Đầu vào

Đầu vào có thể được thực hiện thông qua STDIN hoặc làm đối số chức năng. Đầu vào có thể được lấy dưới dạng danh sách hoặc nếu ngôn ngữ của bạn không hỗ trợ danh sách (hoặc bất kỳ thứ gì tương tự như mảng / từ điển) thì đầu vào có thể được lấy dưới dạng chuỗi phân tách bằng dấu phẩy hoặc dấu cách. Đó là,

"1 4 8 2 5,3 1 5 2 5"

giống như:

[ [1,4,8,2,5], [3,1,5,2,5] ]

Tất cả các danh sách đầu vào sẽ có cùng độ dài.

Đầu ra

Nếu bạn có thể tạo hai danh sách mới có cùng mức trung bình, chương trình / chức năng của bạn sẽ in hoặc trả về giá trị trung bình. Nếu bạn không thể, chương trình của bạn sẽ xuất hiện một khuôn mặt buồn :(.

Lưu ý rằng các danh sách được sắp xếp lại với các phương tiện bằng nhau, nếu chúng tồn tại, không cần phải có cùng độ dài. Bất kỳ số lượng giao dịch hoán đổi có thể được thực hiện để tạo danh sách mới.

Ví dụ

1 4 8 2 5,3 1 5 2 5 -> 1 4 8 2 3,5 1 5 2 5 (swapped 3 and 5) -> 3.6
1 3 6 2,16 19 19 14 -> [[1,6,19,14],[3,2,16,19]] -> 10
2 6 2,6 3 5 -> 2 6,2 6 3 5 (moved 2) -> 4
90 80 20 1,40 60 28 18 -> :(

Đây là để mã ngắn nhất tính theo byte thắng. Như mọi khi, sơ hở tiêu chuẩn là không được phép.


2
Chúng tôi có thể trao đổi bất kỳ số lượng các yếu tố từ mỗi danh sách? Một danh sách chỉ có thể cung cấp các yếu tố cho người khác? Tôi không hiểu ý của bạn là "tồn tại hoán vị hợp lệ". Ngoài ra, điều này cần nhiều trường hợp thử nghiệm.
xnor

@xnor bạn chỉ có thể di chuyển một yếu tố này sang yếu tố khác. Tôi sẽ thêm một vài trường hợp thử nghiệm nữa
Downgoat 29/07/2015

Vì vậy, điều này có tương đương với, "Đưa ra một danh sách duy nhất (liên minh của họ), có thể được phân chia thành hai danh sách không trống có cùng mức trung bình không?"
xnor

1
@ vihan1086 Tại sao không lấy một danh sách làm đầu vào sau đó? Bài thuyết trình của bạn có vẻ phức tạp không cần thiết.
xnor

2
@ vihan1086 Nhìn vào bài đăng trên Sandbox của bạn, nhiều yêu cầu làm rõ tương tự đã được thực hiện ở đó và bạn nói rằng bạn đã làm rõ nhiều điểm này, nhưng các chỉnh sửa của bạn không thực sự làm cho chúng rõ ràng hơn. Bạn nên thay thế văn bản khó hiểu hơn là thêm văn bản.
xnor

Câu trả lời:


12

Bình thường, 24 byte

?}KcsJsQlJmcsdldtPyJK":(

Dùng thử trực tuyến: Trình diễn

Cảm ơn Dennis vì đã nhận thấy một lỗi và chơi golf một byte.

Giải trình:

?}KcsJsQlJmcsdldtPyJK":(   implicit: Q = evaluated input
      sQ                   all numbers of Q
     J                     save them in J
  KcsJ  lJ                 average of J (sum(J) / len(J))
                           store in K
          m     tPyJ       map each nonempty subset d of J to:
           csdld             average of d
?}                         if K in ^:
                    K        print K
                     ":(   else print sad-face

5
Làm tốt lắm, +1. Nhưng Pyth thực sự không có tích hợp để tính toán trung bình?
Alex A.

@AlexA. Bây giờ nó có một (cụ thể .O)
Ông Xcoder

6

SWI-Prolog, 159 byte

a(A,B):-append([A,B],R),permutation(R,S),append([Y,Z],S),sum_list(Y,I),sum_list(Z,J),length(Y,L),length(Z,M),L\=0,M\=0,I/L=:=J/M,W is J/M,write(W);write(':(').

Gọi là a([1,4,8,2,5],[3,1,5,2,5]).


5

Julia, 101 byte

f(a,b)=(m=mean;p=filter(i->m(i[1])==m(i[2]),partitions([a,b],2));isempty(p)?":(":m(collect(p)[1][1]))

Điều này tạo ra một hàm chấp nhận hai mảng và trả về một chuỗi hoặc float tương ứng.

Ungolfed + giải thích:

function f(a,b)
    # Get the set of all 2-way partitions of the array [a,b]
    l = partitions([a,b], 2)

    # Filter the set of partitions to those where the two
    # contained arrays have equal means
    p = filter(i -> mean(i[1]) == mean(i[2]), l)

    # Return a frown if p is empty, otherwise return a mean
    isempty(p) ? ":(" : mean(collect(p)[1][1])
end

2

R, 94 byte

Về cơ bản giống như Jakubes tôi nghĩ. Nếu giá trị trung bình của cả hai danh sách khớp với giá trị trung bình của bất kỳ sự kết hợp nào của các giá trị trong danh sách lên đến nhưng không bao gồm độ dài kết hợp của danh sách, hãy xuất ra giá trị trung bình nếu không phải là mặt buồn.

if(mean(l<-scan())%in%unlist(sapply(2:length(l)-1,function(x)combn(l,x,mean))))mean(l)else':('

Chạy thử nghiệm

> if(mean(l<-scan())%in%unlist(sapply(2:length(l)-1,function(x)combn(l,x,mean))))mean(l)else':('
1: 1 4 8 2 5
6: 3 1 5 2 5
11: 
Read 10 items
[1] 3.6
> if(mean(l<-scan())%in%unlist(sapply(2:length(l)-1,function(x)combn(l,x,mean))))mean(l)else':('
1: 90 80 20 1
5: 40 60 28 18
9: 
Read 8 items
[1] ":("

0

Thạch , 22 byte

FŒ!œs2ÆmE$$Ðf⁾:(ÆmX$Ṇ?

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

Thực hiện với sự giúp đỡ từ ông Xcoder trong trò chuyện

Giải trình

FŒ!œs2ÆmE$$Ðf⁾:(ÆmX$Ṇ? - Main link, argument a (2D-array)

F                      - Flatten
 Œ!                    - All permutations
           Ðf          - Keep elements which are truthy when
   œs2    $            -   split into 2 parts and...
      Æm $             -   the means of each...
        E              -   are the same
                     ? - Ternary if
                    Ṇ  -   Condition: No lists remain
             ⁾:(       -   If so: Set the return value to ":("
                   $   -   Otherwise: 
                Æm     -     Get the mean of each list
                  X    -     Randomly choose one (all elements are the same)

Thất bại cho 2 6 2,6 3 5 -> 2 6,2 6 3 5 (moved 2) -> 4. Bây giờ bạn chỉ chia nó thành hai phần có độ dài bằng nhau.
Kevin Cruijssen
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.