Średnia z dwóch list

11

Średnia z dwóch list

Wyzwanie

Biorąc pod uwagę dwie listy dodatnich liczb całkowitych, określ, czy możliwe jest przestawienie elementów na dwie nowe listy, tak aby nowe listy miały tę samą średnią arytmetyczną (średnią).

Wejście

Dane wejściowe mogą być pobierane przez STDIN lub jako argumenty funkcji. Dane wejściowe można traktować jako listę lub jeśli Twój język nie obsługuje list (lub czegokolwiek podobnego, takiego jak tablice / słowniki), dane wejściowe można traktować jako ciąg znaków rozdzielany przecinkami lub spacjami. To jest,

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

jest taki sam jak:

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

Wszystkie listy wejściowe będą tej samej długości.

Wynik

Jeśli możesz utworzyć dwie nowe listy z tą samą średnią, twój program / funkcja powinna wydrukować lub zwrócić średnią. Jeśli nie możesz, twój program powinien wywołać smutną minę :(.

Pamiętaj, że uporządkowane listy z jednakowymi środkami, jeśli istnieją, nie muszą mieć tej samej długości. Można utworzyć dowolną liczbę zamian, aby utworzyć nowe listy.

Przykłady

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

To jest więc wygrywa najkrótszy kod w bajtach. Jak zawsze, standardowe luki są niedozwolone.

Downgoat
źródło
2
Czy możemy zamienić dowolną liczbę elementów z każdej listy? Czy jedna lista może po prostu dawać elementy drugiej? Nie rozumiem, co rozumiesz przez „istnieje prawidłowa permutacja”. Ponadto wymaga to większej liczby przypadków testowych.
xnor
@ xnor możesz po prostu przenieść jeden element do drugiego. Dodam jeszcze kilka przypadków testowych
Downgoat
Czy to równoznaczne z: „Biorąc pod uwagę jedną listę (ich związek), można ją podzielić na dwie niepuste listy o tej samej średniej?”
xnor
1
@ vihan1086 Dlaczego więc nie wziąć jednej listy jako danych wejściowych? Twoja prezentacja wydaje się niepotrzebnie skomplikowana.
xnor
2
@ vihan1086 Patrząc na Twój post w piaskownicy, pojawiło się tam wiele takich samych próśb o wyjaśnienie, a ty powiedziałeś, że wyjaśniłeś wiele z tych punktów, ale twoje zmiany tak naprawdę nie uczyniły ich bardziej zrozumiałymi. Lepiej byłoby zastąpić mylący tekst niż dodawać dalszy tekst.
xnor

Odpowiedzi:

12

Pyth, 24 bajty

?}KcsJsQlJmcsdldtPyJK":(

Wypróbuj online: demonstracja

Dzięki Dennisowi za zauważenie błędu i grę w jeden bajt.

Wyjaśnienie:

?}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
źródło
5
Dobra robota, +1. Ale czy Pyth naprawdę nie ma wbudowanej funkcji obliczania średniej?
Alex A.,
@AlexA. Teraz ma jeden (mianowicie .O)
pana Xcodera
6

SWI-Prolog, 159 bajtów

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(':(').

Nazywany jako a([1,4,8,2,5],[3,1,5,2,5]).

Fatalizować
źródło
5

Julia, 101 bajtów

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

Tworzy to funkcję, która akceptuje dwie tablice i odpowiednio zwraca łańcuch lub liczbę zmiennoprzecinkową.

Niegolfowane + wyjaśnienie:

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.
źródło
2

R, 94 bajtów

Zasadniczo tak samo jak Jakubes. Jeśli średnia z obu list odpowiada średniej dowolnej kombinacji wartości na listach, ale nie obejmuje łącznej długości listy, wyślij średnią w przeciwnym razie smutną twarz.

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

Testowe uruchomienie

> 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
źródło
0

Galaretka , 22 bajty

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

Wypróbuj online!

Zrobione z pomocą pana Xcodera na czacie

Wyjaśnienie

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)
Cairney Coheringaahing
źródło
Nie działa na 2 6 2,6 3 5 -> 2 6,2 6 3 5 (moved 2) -> 4. Teraz dzielisz go tylko na dwie równe części.
Kevin Cruijssen,