Promedio de dos listas

11

Promedio de dos listas

Desafío

Dadas dos listas de enteros positivos, determine si es posible reorganizar los elementos en dos nuevas listas de modo que las nuevas listas tengan la misma media aritmética (promedio).

Entrada

La entrada se puede tomar a través de STDIN o como argumentos de función. La entrada se puede tomar como una lista, o si su idioma no admite listas (o algo similar, como matrices / diccionarios), la entrada se puede tomar como una cadena delimitada por comas o espacios. Es decir,

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

es lo mismo que:

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

Todas las listas de entrada tendrán la misma longitud.

Salida

Si puede crear dos listas nuevas con el mismo promedio, su programa / función debería imprimir o devolver la media. Si no puede, su programa debería mostrar una cara triste :(.

Tenga en cuenta que las listas reorganizadas con los mismos medios, si existen, no necesitan tener la misma longitud. Se puede realizar cualquier número de intercambios para crear las nuevas listas.

Ejemplos

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 es el por lo que el código más corto en bytes gana. Como siempre, las lagunas estándar no están permitidas.

Downgoat
fuente
2
¿Podemos intercambiar cualquier número de elementos de cada lista? ¿Puede una lista simplemente dar elementos a la otra? No entiendo lo que quieres decir con "existe una permutación válida". Además, esto necesita más casos de prueba.
xnor
@xnor puedes mover un elemento a otro. Agregaré algunos casos de prueba más
Downgoat
Entonces, ¿esto es equivalente a, "Dada una sola lista (su unión), ¿puede dividirse en dos listas no vacías con el mismo promedio?"
xnor
1
@ vihan1086 ¿Por qué no tomar una sola lista como entrada entonces? Su presentación parece innecesariamente complicada.
xnor
2
@ vihan1086 Al mirar su publicación de Sandbox, muchas de estas mismas solicitudes de aclaración se hicieron allí, y usted dijo que aclaró muchos de estos puntos, pero sus ediciones realmente no los aclararon. Habría sido mejor reemplazar el texto confuso en lugar de agregar más texto.
xnor

Respuestas:

12

Pyth, 24 bytes

?}KcsJsQlJmcsdldtPyJK":(

Pruébelo en línea: demostración

Gracias a Dennis por notar un error y jugar al golf un byte.

Explicación:

?}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
fuente
55
Buen trabajo, +1. ¿Pero Pyth realmente no tiene una función integrada para calcular la media?
Alex A.
@AlexA. Ahora tiene uno (a saber .O)
Sr. 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(':(').

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

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

Esto crea una función que acepta dos matrices y devuelve una cadena o un flotante en consecuencia.

Ungolfed + explicación:

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.
fuente
2

R, 94 bytes

Básicamente lo mismo que Jakubes, creo. Si la media de ambas listas coincide con la media de cualquier combinación de los valores en las listas hasta la longitud combinada de la lista, pero sin incluirla, arroje la media, de lo contrario, la cara triste.

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

Prueba de funcionamiento

> 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
fuente
0

Jalea , 22 bytes

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

Pruébalo en línea!

Hecho con la ayuda del Sr. Xcoder en el chat

Explicación

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
fuente
Falla por 2 6 2,6 3 5 -> 2 6,2 6 3 5 (moved 2) -> 4. Ahora solo lo está dividiendo en dos partes de igual longitud.
Kevin Cruijssen