Ś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.


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

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


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

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

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)

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.