Среднее из двух списков


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 вы можете просто переместить один элемент в другой. Я добавлю еще несколько тестов
Downgoat

Итак, эквивалентно ли это: «Учитывая один список (их объединение), можно ли разбить его на два непустых списка с одинаковым средним значением?»
xnor

1
@ vihan1086 Почему бы тогда не взять один список в качестве входных данных? Ваша презентация кажется излишне сложной.
xnor

2
@ vihan1086 Глядя на ваше сообщение в Песочнице, многие из тех же самых запросов о разъяснении были сделаны там, и вы сказали, что прояснили многие из этих пунктов, но ваши правки не сделали их более ясными. Вы бы лучше заменили запутанный текст, а не добавляли дополнительный текст.
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-Пролог, 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]))

Это создает функцию, которая принимает два массива и возвращает строку или число с плавающей запятой соответственно.

Ungolfed + объяснение:

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.