Média de duas listas


11

Média de duas listas

Desafio

Dadas duas listas de números inteiros positivos, determine se é possível reorganizar os elementos em duas novas listas, de modo que as novas listas tenham a mesma média aritmética (média).

Entrada

A entrada pode ser obtida através de STDIN ou como argumentos de função. A entrada pode ser tomada como uma lista ou, se o seu idioma não suportar listas (ou qualquer coisa semelhante, como matrizes / dicionários), a entrada pode ser tomada como uma string delimitada por vírgula ou espaço. Isso é,

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

é o mesmo que:

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

Todas as listas de entrada terão o mesmo comprimento.

Resultado

Se você pode criar duas novas listas com a mesma média, seu programa / função deve imprimir ou retornar a média. Se você não pode, seu programa deve mostrar uma cara triste :(.

Observe que as listas reorganizadas com médias iguais, se existirem, não precisam ter o mesmo comprimento. Qualquer número de trocas pode ser feito para criar as novas listas.

Exemplos

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

Este é o pelo que o código mais curto em bytes vence. Como sempre, as brechas padrão não são permitidas.


2
Podemos trocar qualquer número de elementos de cada lista? Uma lista pode apenas fornecer elementos para a outra? Não entendo o que você quer dizer com "existe permutação válida". Além disso, isso precisa de mais casos de teste.
xnor

@ xnor, você pode simplesmente mover um elemento para outro. Vou adicionar mais alguns casos de teste
Downgoat

Portanto, isso equivale a: "Dada uma única lista (sua união), pode ser particionada em duas listas não vazias com a mesma média?"
xnor 29/07

1
@ vihan1086 Por que não usar uma única lista como entrada? Sua apresentação parece desnecessariamente complicada.
xnor

2
@ vihan1086 Olhando para a sua postagem no Sandbox, muitos desses mesmos pedidos de esclarecimento foram feitos lá e você disse que esclareceu muitos desses pontos, mas suas edições não os tornaram realmente mais claros. Seria melhor substituir o texto confuso em vez de adicionar mais texto.
xnor 29/07

Respostas:


12

Pitão, 24 bytes

?}KcsJsQlJmcsdldtPyJK":(

Experimente online: Demonstração

Agradecemos a Dennis por perceber um erro e jogar um byte.

Explicação:

?}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
Bom trabalho, +1. Mas Pyth realmente não tem um built-in para calcular a média?
28515 Alex A.

@AlexA. Ela agora tem um (a saber .O)
Mr. Xcoder

6

SWI-Prolog, 159 bytes

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

Chamado como a([1,4,8,2,5],[3,1,5,2,5]).


5

Julia, 101 bytes

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

Isso cria uma função que aceita duas matrizes e retorna uma string ou um float de acordo.

Ungolfed + explicação:

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 bytes

Basicamente, o mesmo que Jakubes, eu acho. Se a média de ambas as listas corresponder à média de qualquer combinação dos valores em listas até, mas não incluindo, o comprimento combinado da lista, imprima a média, caso contrário, o rosto triste.

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

Execução de teste

> 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

Gelatina , 22 bytes

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

Experimente online!

Feito com a ajuda do Sr. Xcoder no chat

Explicação

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)

Falha em 2 6 2,6 3 5 -> 2 6,2 6 3 5 (moved 2) -> 4. Você está apenas dividindo-o em duas partes de igual comprimento agora.
Kevin Cruijssen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.