Середня кількість двох списків


11

Середня оцінка двох списків

Виклик

Давши два списки натуральних чисел, визначте, чи можна переставити елементи у два нові списки, щоб нові списки мали однакове середнє арифметичне (середнє).

Вхідні дані

Вхід може прийматися через STDIN або як аргументи функції. Введення можна сприймати як список, або якщо ваша мова не підтримує списки (або щось подібне, наприклад, масиви / словники), тоді введення даних може сприйматися як рядок, обмежений комою або пробілом. Це,

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

те саме, що:

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

Усі вхідні списки будуть однакової довжини.

Вихідні дані

Якщо ви можете створити два нові списки з однаковим середнім значенням, ваша програма / функція повинна надрукувати або повернути середнє значення. Якщо ви не можете, ваша програма повинна видавати сумне обличчя :(.

Зауважте, що переставлені списки з рівними засобами, якщо вони існують, не повинні мати однакову довжину. Будь-яка кількість свопів може бути здійснена для створення нових списків.

Приклади

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

Це тому найкоротший код в байтах виграє. Як завжди, стандартні лазівки заборонені.


2
Чи можемо ми поміняти будь-яку кількість елементів із кожного списку? Чи може один список просто дати елементи іншому? Я не розумію, що ви маєте на увазі під "дійсною перестановкою існує". Також для цього потрібно більше тестових випадків.
xnor

@xnor ви можете просто перемістити один елемент до іншого. Додам ще кілька тестових випадків
Пуховик

Отже, чи такий еквівалент: "Враховуючи єдиний список (їх об'єднання), можна поділити його на два не порожні списки з однаковим середнім показником?"
xnor

1
@ vihan1086 Чому б тоді не взяти жоден список як вхідний? Ваша презентація видається непотрібною.
xnor

2
@ vihan1086 Переглядаючи вашу публікацію в Sandbox, багато таких самих запитів на роз'яснення були зроблені там, і ви сказали, що ви уточнили багато цих пунктів, але ваші зміни не зробили їх зрозумілішими. Вам краще було б замінити заплутаний текст, а не додавати подальший текст.
xnor

Відповіді:


12

Pyth, 24 байти

?}KcsJsQlJmcsdldtPyJK":(

Спробуйте в Інтернеті: Демонстрація

Дякуємо Деннісу за те, що помітив помилку та переграв один байт.

Пояснення:

?}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
Приємна робота, +1. Але хіба Pyth насправді не має вбудованого для обчислення середнього?
Олексій А.

@AlexA. Зараз у нього є один (а саме .O)
Містер Xcoder

6

SWI-Prolog, 159 байт

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

Називається як a([1,4,8,2,5],[3,1,5,2,5]).


5

Джулія, 101 байт

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

Це створює функцію, яка приймає два масиви і відповідно повертає рядок або float.

Недоліковані + пояснення:

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 байт

В основному те саме, що і Якубес, я думаю. Якщо середнє значення обох списків відповідає середньому для будь-якої комбінації значень у списках до, але не включає комбіновану довжину списку, виведіть середнє значення в іншому випадку сумного обличчя.

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

Тестовий запуск

> 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

Желе , 22 байти

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

Спробуйте в Інтернеті!

Зроблено за допомогою пана Xcoder у чаті

Пояснення

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)

Невдачі для 2 6 2,6 3 5 -> 2 6,2 6 3 5 (moved 2) -> 4. Ви лише розділили його на дві частини однакової довжини.
Кевін Кройсейсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.