Media fuori due liste


11

Media di due liste

Sfida

Dati due elenchi di numeri interi positivi, determinare se è possibile riorganizzare gli elementi in due nuovi elenchi in modo tale che i nuovi elenchi abbiano la stessa media aritmetica (media).

Ingresso

L'input può essere acquisito tramite STDIN o come argomento di funzione. L'input può essere preso come un elenco o se la tua lingua non supporta elenchi (o qualcosa di simile come array / dizionari), allora l'input può essere preso come una stringa delimitata da virgole o spazi. Questo è,

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

equivale a:

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

Tutti gli elenchi di input avranno la stessa lunghezza.

Produzione

Se riesci a creare due nuovi elenchi con la stessa media, il tuo programma / funzione dovrebbe stampare o restituire la media. Se non ci riesci, il tuo programma dovrebbe avere una faccia triste :(.

Si noti che gli elenchi riorganizzati con mezzi uguali, se esistono, non devono necessariamente avere la stessa lunghezza. È possibile effettuare qualsiasi numero di swap per creare i nuovi elenchi.

Esempi

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

Questo è quindi vince il codice più breve in byte. Come sempre, le scappatoie standard sono vietate.


2
Possiamo scambiare un numero qualsiasi di elementi da ciascun elenco? Una lista può semplicemente dare elementi all'altra? Non capisco cosa intendi con "esiste una permutazione valida". Inoltre, ciò richiede più casi di test.
xnor

@xnor puoi semplicemente spostare un elemento, su un altro. Aggiungerò alcuni altri casi di test
Downgoat,

Quindi, questo equivale a "Dato un unico elenco (la loro unione), può essere suddiviso in due elenchi non vuoti con la stessa media?"
xnor

1
@ vihan1086 Perché non prendere un unico elenco come input allora? La tua presentazione sembra inutilmente complicata.
xnor

2
@ vihan1086 Guardando il tuo post su Sandbox, molte di queste stesse richieste di chiarimenti sono state fatte lì, e hai detto che hai chiarito molti di questi punti, ma le tue modifiche non le hanno rese più chiare. Sarebbe stato meglio sostituire il testo confuso piuttosto che aggiungere altro testo.
xnor

Risposte:


12

Pyth, 24 byte

?}KcsJsQlJmcsdldtPyJK":(

Provalo online: dimostrazione

Grazie a Dennis per aver notato un errore e aver giocato a golf a un byte.

Spiegazione:

?}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
Bel lavoro, +1. Ma Pyth non ha davvero un built-in per calcolare la media?
Alex A.

@AlexA. Ora ne ha uno (vale a dire .O)
Mr. Xcoder,

6

SWI-Prolog, 159 byte

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

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


5

Julia, 101 byte

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

Ciò crea una funzione che accetta due matrici e restituisce una stringa o un float di conseguenza.

Ungolfed + spiegazione:

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 byte

Praticamente lo stesso di Jakubes penso. Se la media di entrambi gli elenchi corrisponde alla media di qualsiasi combinazione dei valori negli elenchi fino a, ma non includendo la lunghezza combinata dell'elenco, emettere la media altrimenti la faccia triste.

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

Prova

> 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 byte

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

Provalo online!

Fatto con l'aiuto di Mr. Xcoder in chat

Spiegazione

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)

Non funziona per 2 6 2,6 3 5 -> 2 6,2 6 3 5 (moved 2) -> 4. Adesso lo stai solo dividendo in due parti di uguale lunghezza.
Kevin Cruijssen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.