Rata-Rata Keluar Dua Daftar

11

Rata-rata dua daftar

Tantangan

Diberikan dua daftar bilangan bulat positif, tentukan apakah mungkin untuk mengatur ulang elemen menjadi dua daftar baru sehingga daftar baru memiliki rata-rata aritmatika yang sama (rata-rata).

Memasukkan

Masukan dapat diambil melalui STDIN atau sebagai argumen fungsi. Input dapat diambil sebagai daftar, atau jika bahasa Anda tidak mendukung daftar (atau yang serupa seperti array / kamus) maka input dapat diambil sebagai string yang dibatasi koma atau spasi. Itu adalah,

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

sama dengan:

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

Semua daftar input akan memiliki panjang yang sama .

Keluaran

Jika Anda dapat membuat dua daftar baru dengan rata-rata yang sama, program / fungsi Anda harus mencetak atau mengembalikan rata-rata. Jika Anda tidak bisa, program Anda akan menampilkan wajah sedih :(.

Perhatikan bahwa daftar ulang dengan cara yang sama, jika ada, tidak perlu memiliki panjang yang sama. Sejumlah swap dapat dilakukan untuk membuat daftar baru.

Contohnya

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

Ini adalah sehingga kode terpendek dalam byte menang. Seperti biasa, celah standar tidak diizinkan.

Downgoat
sumber
2
Bisakah kita menukar sejumlah elemen dari setiap daftar? Bisakah satu daftar hanya memberikan elemen ke yang lain? Saya tidak mengerti apa yang Anda maksud dengan "permutasi yang valid ada". Juga, ini membutuhkan lebih banyak kasus uji.
xnor
@xnor Anda bisa memindahkan satu elemen ke elemen lainnya. Saya akan menambahkan beberapa lagi test case
Downgoat
Jadi, apakah ini setara dengan, "Diberikan satu daftar (penyatuan mereka), dapatkah dipartisi menjadi dua daftar kosong dengan rata-rata yang sama?"
xnor
1
@ vihan1086 Mengapa tidak mengambil satu daftar sebagai masukan saja? Presentasi Anda tampaknya tidak perlu rumit.
xnor
2
@ vihan1086 Melihat posting Sandbox Anda, banyak dari permintaan klarifikasi yang sama dibuat di sana, dan Anda mengatakan Anda telah mengklarifikasi banyak poin ini, tetapi suntingan Anda tidak benar-benar membuatnya lebih jelas. Anda sebaiknya mengganti teks yang membingungkan daripada menambahkan teks lebih lanjut.
xnor

Jawaban:

12

Pyth, 24 byte

?}KcsJsQlJmcsdldtPyJK":(

Cobalah online: Peragaan

Terima kasih kepada Dennis karena melihat ada kesalahan dan bermain golf satu byte.

Penjelasan:

?}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
Jakube
sumber
5
Kerja bagus, +1. Tetapi apakah Pyth benar-benar tidak memiliki built-in untuk menghitung mean?
Alex A.
@AlexA. Sekarang memang memiliki satu (yaitu .O)
Mr. 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(':(').

Disebut sebagai a([1,4,8,2,5],[3,1,5,2,5]).

Fatalisasi
sumber
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]))

Ini menciptakan fungsi yang menerima dua array dan mengembalikan string atau float yang sesuai.

Penjelasan + tidak dikumpulkan:

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
Alex A.
sumber
2

R, 94 Bytes

Pada dasarnya sama dengan Jakubes, saya pikir. Jika rata-rata dari kedua daftar cocok dengan rata-rata dari setiap kombinasi nilai dalam daftar hingga tetapi tidak termasuk panjang gabungan dari daftar, buat rata-rata hasilnya sebaliknya wajah sedih.

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

Uji coba

> 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] ":("
MickyT
sumber
0

Jelly , 22 byte

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

Cobalah online!

Dilakukan dengan bantuan dari Mr. Xcoder dalam obrolan

Penjelasan

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)
caird coinheringaahing
sumber
Gagal untuk 2 6 2,6 3 5 -> 2 6,2 6 3 5 (moved 2) -> 4. Anda hanya membaginya menjadi dua bagian dengan panjang yang sama sekarang.
Kevin Cruijssen