Durchschnitt aus zwei Listen

11

Durchschnitt aus zwei Listen

Herausforderung

Bestimmen Sie anhand von zwei Listen positiver Ganzzahlen, ob es möglich ist, die Elemente in zwei neue Listen umzuordnen, sodass die neuen Listen das gleiche arithmetische Mittel (Durchschnitt) haben.

Eingang

Die Eingabe kann über STDIN oder als Funktionsargumente erfolgen. Die Eingabe kann als Liste verwendet werden. Wenn Ihre Sprache keine Listen unterstützt (oder ähnliche Elemente wie Arrays / Wörterbücher), kann die Eingabe als durch Kommas oder Leerzeichen getrennte Zeichenfolge verwendet werden. Das ist,

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

ist das gleiche wie:

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

Alle Eingabelisten haben die gleiche Länge.

Ausgabe

Wenn Sie zwei neue Listen mit demselben Durchschnitt erstellen können, sollte Ihr Programm / Ihre Funktion den Mittelwert drucken oder zurückgeben. Wenn Sie nicht können, sollte Ihr Programm ein trauriges Gesicht ausgeben :(.

Beachten Sie, dass die neu angeordneten Listen mit gleichen Mitteln, falls vorhanden, nicht dieselbe Länge haben müssen. Es können beliebig viele Swaps durchgeführt werden, um die neuen Listen zu erstellen.

Beispiele

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

Dies ist so dass der kürzeste Code in Bytes gewinnt. Standardschlupflöcher sind wie immer nicht zulässig.

Downgoat
quelle
2
Können wir eine beliebige Anzahl von Elementen aus jeder Liste austauschen? Kann eine Liste der anderen nur Elemente geben? Ich verstehe nicht, was Sie unter "gültige Permutation existiert" verstehen. Dies erfordert auch mehr Testfälle.
xnor
@xnor Sie können einfach ein Element in ein anderes verschieben. Ich werde noch ein paar Testfälle hinzufügen
Downgoat
Entspricht dies also: "Kann eine gegebene Liste (ihre Vereinigung) in zwei nicht leere Listen mit demselben Durchschnitt aufgeteilt werden?"
xnor
1
@ vihan1086 Warum nicht eine einzelne Liste als Eingabe nehmen? Ihre Präsentation erscheint unnötig kompliziert.
xnor
2
@ vihan1086 Wenn Sie sich Ihren Sandbox-Beitrag ansehen, wurden dort viele der gleichen Anfragen zur Klärung gestellt, und Sie sagten, Sie hätten viele dieser Punkte geklärt, aber Ihre Änderungen haben sie nicht wirklich klarer gemacht. Es wäre besser gewesen, den verwirrenden Text zu ersetzen, als weiteren Text hinzuzufügen.
xnor

Antworten:

12

Pyth, 24 Bytes

?}KcsJsQlJmcsdldtPyJK":(

Probieren Sie es online aus: Demonstration

Vielen Dank an Dennis, der einen Fehler bemerkt und ein Byte Golf gespielt hat.

Erläuterung:

?}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
quelle
5
Gute Arbeit, +1. Aber hat Pyth wirklich keine eingebaute Methode zur Berechnung des Mittelwerts?
Alex A.
@AlexA. Es hat jetzt eine (nämlich .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(':(').

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

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

Dadurch wird eine Funktion erstellt, die zwei Arrays akzeptiert und entsprechend eine Zeichenfolge oder einen Gleitkommawert zurückgibt.

Ungolfed + Erklärung:

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

R, 94 Bytes

Im Grunde das gleiche wie Jakubes, denke ich. Wenn der Mittelwert beider Listen mit dem Mittelwert einer beliebigen Kombination der Werte in Listen übereinstimmt, jedoch die kombinierte Länge der Liste nicht einschließt, geben Sie den Mittelwert aus, andernfalls das traurige Gesicht.

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

Testlauf

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

Gelee , 22 Bytes

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

Probieren Sie es online aus!

Fertig mit Hilfe von Mr. Xcoder im Chat

Erläuterung

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
quelle
Schlägt für 2 6 2,6 3 5 -> 2 6,2 6 3 5 (moved 2) -> 4. Sie teilen es jetzt nur in zwei Teile gleicher Länge auf.
Kevin Cruijssen