Сравните средние из моих списков

18

Получение среднего из списка (например [2,6,7])

  • Получить длину списка: [2,6,7] -> 3
  • Суммировать числа в списке: 2 + 6 + 7 = 15.
  • Разделите сумму на их подсчета: 15 / 3 = 5.

Вы должны сравнить средние значения двух списков натуральных чисел N и M , возвращая значение, если N имеет более высокое среднее значение, другое значение, если M имеет более высокое среднее значение, и другое значение в случае связи.


Правила ввода / вывода

Все стандартные методы ввода и вывода разрешены.

вход

Вы можете использовать входные данные в виде двух отдельных списков, вложенного списка или чего-либо еще, что вы считаете подходящим для этой задачи. Пожалуйста, укажите формат.

Выход

Указанные значения должны быть различны и состоять как минимум из одного непробельного символа. Кроме того, они должны быть согласованы между прогонами (одно значение для N , одно значение для M , одно значение для Tie ). Пожалуйста, укажите это в своем ответе. Значения могут быть непустыми строками, значениями типа Bool, целыми числами или чем угодно, что вы считаете подходящим.


Спекуляции

  • Списки не обязательно будут иметь одинаковую длину.

  • Вам гарантировано, что списки не являются пустыми.


Тестовые случаи

Я выбрал значения N wins, M winsи Tie, которые в значительной степени самоочевидны.

N, M -> Выход (в среднем)

[7], [6] -> N выигрывает (N имеет 7, M имеет 6)
[4,5], [4,4] -> N побед (N имеет 4,5, M имеет 4)
[2,3,4], [4,5,6] -> M выигрывает (N имеет 3, M имеет 5)
[4,1,3], [7,3,2,1,1,2] -> Tie (оба имеют 2,666 ...)
[100,390,1], [89,82,89] -> N побед (N имеет 163,666 ..., M имеет 86,666 ...)
[92,892], [892,92] -> Галстук (списки в основном идентичны) 
[10,182], [12,78,203,91] -> Галстук (оба имеют 96)

Применяются стандартные лазейки . Пояснения приветствуются! Это , поэтому выигрывает самый короткий код в байтах!

Мистер Xcoder
источник
Песочница .
г-н Xcoder
если мой язык выбора поддерживает только целые числа, могу ли я взять ввод, умноженный на 1000? Таким образом, рассчитанные средние значения будут с точностью до 3 десятичных знаков
Скидсдев
@Mayube Да, это разрешено
мистер Xcoder
Мы должны вернуть результат не менее 1 символа. Означает ли это, что мы должны вернуть символ или строку? Или вы имеете в виду вывод, чье строковое значение имеет как минимум 1 символ?
Оливье Грегуар
@ OlivierGrégoire Выходные данные должны иметь длину не менее 1 символа (вы не можете вернуть пустую строку, но можете вернуть любую строку длиной не менее 1 символа, а также любой непробельный символ). Тебе решать.
г-н Xcoder

Ответы:

15

Mathematica, 15 байт

Order@@Mean/@#&

Попробуйте онлайн!

Functionкоторый ожидает список из двух списков. Mean/@#принимает среднее арифметическое каждого списка во входных данных, затем передаются эти средние Order, которые возвращаются, -1если выигрывает первый список, 0если есть связь, и 1если выигрывает второй список.

ngenisis
источник
7

JavaScript (ES6), 52 50 байт

(Сохранено 2 байта благодаря @Shaggy.)

Вот два 50-байтовых решения:

f=(N,M,a=eval(N.join`+`)/N.length)=>M?(a-f(M))/0:a

(N,M,A=a=>eval(a.join`+`)/a.length)=>(A(N)-A(M))/0

Возвращает бесконечность для N, бесконечность для M и NaN для связи.

Первое решение может потребовать небольшого объяснения из-за рекурсии:

При первом вызове функции aинициализируется как среднее значение Nмассива:

a=eval(N.join`+`)/N.length

M имеет значение в этой точке, поэтому первая часть условного выражения называется:

M ? (a-f(M))/0 : a  ----------    

Эта функция вызывается в этом выражении, на этот раз с заменой Mна N.

При этом втором вызове функции aинициализируется как среднее значение N––, которое было Mв предыдущем вызове.

Поскольку во время этого вызова функции нет второго параметра, запускается вторая часть условного выражения, которая возвращает среднее значение:

M ? (a-f(M))/0 : a  --

Теперь мы можем лучше понять выражение:

(a - f(M)) / 0

Это:

(the average of N  minus  the average of M) divided by 0

Разница между средними значениями будет положительным числом, отрицательным числом или 0.

Разделение разницы на 0 приводит к бесконечности , -Infinity или NaN - предоставляя три различных значения по мере необходимости.

Тестовые случаи:

Рик Хичкок
источник
Не могли бы вы сохранить пару байтов, перейдя Aк параметрам функции?
Лохматый
5

Mathematica, 21 байт

Sign[Mean@#-Mean@#2]&

1 для #побед, -1 для #2побед, 0 для ничьей.

CalculatorFeline
источник
или, что одинаково долго,Sign[#-#2&@@Mean/@#]&
Грег Мартин
5

MATL , 8 байт

Тааак много модификаторов ( Yа Z). Я не могу найти способ сделать это короче. sum / number_of_elementsэто три байта. Это может быть лучший способ сделать -ZS, но я не могу найти один.

YmiYm-ZS

Попробуйте онлайн!

           % Take first input implicitly
Ym         % Mean of that input
  i        % Grab second input
   Ym      % Mean of that input
     -     % Subtract
      ZS   % Sign

Возвращает, 1если первый вход больше, 0если они связаны, и -1если второй вход больше.

Стьюи Гриффин
источник
5

05AB1E , 9 байтов

1 если Mпобедит, -1 если Nпобедит и 0 для ничьей.

vyOyg/}.S

Попробуйте онлайн!

объяснение

v           # for each y in list of lists
 yO         # sum y
   yg       # get length of y
     /      # divide
      }     # end loop
       .S   # compare
Emigna
источник
3

Октава , 27 байт

@(x,y)sign(mean(x)-mean(y))

Попробуйте онлайн!

Принимает два вектора в x.yкачестве входных данных, принимает meanоба вектора и вычитает один из другого. Получите знак этого, чтобы получить 1, 0и -1для трех различных альтернатив.

Стьюи Гриффин
источник
3

Python 2, 49 байт

lambda N,M:cmp(1.*sum(N)/len(N),1.*sum(M)/len(M))

Попробуйте онлайн

mbomb007
источник
«... [три выхода] должны быть согласованы между прогонами»
Джонатан Аллан
3
@JonathanAllan Исправлено
mbomb007
3

APL (Дьялог) , 11 байт

Запрашивает список из двух списков. Печатается, 1если левое имеет более высокое среднее значение, 0, если у них одинаковое среднее значение, а ¯1если справа - более высокое среднее.

×-/(+/÷≢)¨⎕

Попробуйте онлайн!

 незамедлительный

( Применить следующую молчаливую функцию к каждому:

+/ сумма

÷ деленное на

 подсчет

-/ вставить (и оценить) минус между ними

× сигнум

Адам
источник
3

Javascript, 81 66 58 56 байт

спас 15 байтов благодаря Люку

сэкономил 2 байта благодаря Джастину Маринеру

n=>m=>Math.sign((a=b=>eval(b.join`+`)/b.length)(m)-a(n))

Галстук равен 0, М равен 1 и N равен -1. Вызывается с использованием синтаксиса карри, например.f([7])([6])

SuperStormer
источник
1
Вы можете улучшить это на несколько байтов: вы можете удалить присвоение переменной, вы можете использовать синтаксис карри, вы можете удалить предупреждение, и вы можете легко суммировать массивы, используя eval(a.join`+`). a=>(b=a.map(c=>eval(c.join`+`)/c.length))[0]-b[1]?b[0]>b[1]:0для 61 байта. Он принимает входные данные в виде массива массивов и выходные данные 0для связи, trueдля M и falseдля N.
Лука,
почему вы не публикуете это как собственный ответ?
SuperStormer
1
Вы можете сэкономить еще два байта на встраивание функции ( a) в первый раз , он используется: n=>m=>Math.sign((a=b=>eval(b.join`+`)/b.length)(m)-a(n)).
Джастин Маринер
3

Хаскелл, 65 43 байта

Сохранено 22 байта благодаря NIMI!

a x=sum x/sum[1|_<-x] 
x#y=compare(a x)$a y

Должен быть намного лучший способ ... Но преобразования типа меня облажали.

использование

(#) [7] [6]

Возвращает, GTесли побеждает первый аргумент, LTесли побеждает второй аргумент, иEQ связывают ли они.

Попробуйте онлайн!

Генри
источник
1
Не нужно кастовать sum$xс f.. Кроме того : length xможет быть заменен sum[1|_<-x], так что вы можете избавиться от fполностью: a x=sum x/sum[1|_<-x].
Ними
Ах, хорошо! Даже не думал сделать это.
Генри
1
... о и #: ...(a x)$a y.
Ними
1
... еще лучше: идти pointfree с основной функцией, то вы можете даже сохранить имя для него: (.a).compare.a. Использование: ( (.a).compare.a ) [7] [6].
Ними
2
Еще один: так [1|_<-x]же, как (1<$x).
Nimi
3

J, 10 байт

*@-&(+/%#)

Один список дан слева, один справа. Вернет _1, если левое среднее меньше, 1, если оно больше, и 0, если они равны

  • (+/%#) стандартный J-форк для вычисления среднего по списку
  • &предоставляет вариацию на диадической вилке. он применяет правую часть (в данном случае средний глагол) к обоим аргументам, а затем передает их глаголу с левой стороны, который в этом случае ...
  • *@- вычитание с последующим «знаком»: таким образом, правое среднее значение вычитается из левого, и нам дается знак результата - _1, 1 или 0
Ион
источник
3

Pyth, 10 8 7 6 байтов

Спасибо @isaacg за сохранение байта

._-F.O

Ввод принимается как вложенный список [N, M]. Выходы -1если N < M, 1если N > Mи 0если они равны.

Попробуйте онлайн

jacoblaw
источник
Вы можете сохранить байт, заменив h.+на-F
isaacg
3

TI-Basic, 25 21 13 12 10 байт

-2 байта благодаря lirtosiast

:tanh(ᴇ9mean(L₁-mean(L₂
Oki
источник
2
Для этого можно использовать Ansвместо C: mean(L₁)>mean(L₂:Ans+3(mean(L₁)=mean(L₂21 байта.
Скотт Милнер
Вы можете удалить (и ).
lirtosiast
2

Желе , 7 байт

S÷Lµ€IṠ

Монадическая ссылка, принимающая список из двух списков, N,Mкоторый возвращает:
[-1]for N;
[1]для M; и
[0]для галстука.
В полной программе печатает результат (списки единичной статьи печатать их содержание только, так -1, 1или 0).

Попробуйте онлайн!

Как?

S÷Lµ€IṠ - Link: list of lists, [N,M]
   µ€   - perform the chain to the left for €ach (of N, M)
S       -   sum
  L     -   length
 ÷      -   divide (yields the average)
     I  - incremental differences (yields [avg(M) - avg(N)])
      Ṡ - sign (yields: [1] if avg(M)>avg(N); [-1] if avg(N)>avg(M); or [0] if equal)
Джонатан Аллан
источник
Я знал, что Джелли справится с этой задачей, я просто не очень хорошо знаю язык. Молодцы, победив меня: P
Okx,
Я не уверен на 100%, что это невозможно, скажем, в 5 ...!
Джонатан Аллан
@JonathanAllan Я? В основном, чтобы получить средние значения, вы отображаете функцию усреднения, которая еще не является встроенной, поэтому вы используете самый короткий (я полагаю) аналог S÷L, а затем вы преобразуете его в одноканальную, через S÷¥L$которую можно сократить, S÷Lµпоскольку она находится на в самом начале программы, а затем вы сразу же добавляете карту, а затем, поскольку нет встроенной функции для сравнения, которую вы бы использовали, _/Ṡно вы можете сократить ее, IṠтак как это все еще 3 различных вывода cmp ... да, почти наверняка это не может быть сделано в 5. Также 5 не поможет, так как я FGITW'd. :)
Эрик Outgolfer
2

Perl 6 , 25 байт

{sign [-] .map:{.sum/$_}}

Попробуйте онлайн!

Принимает один аргумент, двухэлементный список списков чисел. Возвращает, 1если первый список имеет большее среднее значение, -1если второй список имеет, и 0если средние значения равны.

Шон
источник
2

JavaScript (ES6), 60 байт

a=>(b=(c=a.map(d=>eval(d.join`+`)/d.length))[0])-c[1])?b>0:0

Выходы 0для Tie, trueдля Nи falseдля M.

Люк
источник
2

JavaScript (ES6), 60 54 байта

-6 байт благодаря @Luke и @Neil

(i,[x,y]=i.map(v=>eval(v.join`+`)/v.length))=>y-x&&x>y

Принимает ввод как массив из 2 элементов [N, M]. Выходы true, 0, или falseдля N, Tieили M, соответственно.

объяснение

(i,                 // input array: [N, M]
    [x,y] =         // destructure assignment: set x and y to...
    i.map(v=>       // the input values mapped as...
        eval(v.join`+`) // the sum, by joining the array with +
        / v.length      // divided by the length
    )
) => y-x && x>y     // return 0 for tie, or the result of avg(N) > avg(M)

Тестовый фрагмент

Введите числа, разделенные пробелами / запятыми.

Джастин Маринер
источник
1
Вы можете, вероятно, сохранить несколько байтов, заменив Math.sign(y-x)на y-x?x>y:0. Выходы 0для Tie, trueдля Nи falseдля M.
Люк
1
x-y&&x>yвозможно?
Нил
@Neil Хорошо, даже лучше
Джастин Маринер
2

Пип , 13 байт

{$CM$+*a/#*a}

Это функция, которая принимает список списков. Возвращает, 1если первое среднее значение больше, -1если второе больше, 0если оно связано. Запустите все тесты здесь.

Фон

В этом решении интенсивно используются два метаоператора Пипа:

  • $, сложите. Возьмите бинарный оператор и примените его между элементами списка. Например, +сложение, но $+суммирует список. Обратите внимание, что $бинарный оператор превращается в унарный оператор.
  • *, карта. Возьмите унарный оператор и примените его к каждому элементу списка. Например, #дает длину списка, но #*дает (список) длины элементов списка.
  • Эти два метаоператора могут быть объединены: $+*карты складываются / складываются по списку, суммируя каждый из элементов списка.

Еще одна вещь, которую нужно знать о Pip, это то, что многие операторы по умолчанию работают со списками по пунктам. Например, [1 2 3] * 5дает [5 10 15]; [1 2 3] * [2 3 4]дает [2 6 12]; и [[1 2] [3 4]] * [5 6]дает [[5 10] [18 24]].

объяснение

Мы будем использовать пример ввода [[2 3 4] [2 3 4 6]]:

  • {...}
    Определяет функцию. (Первый) аргумент связан с локальной переменной a.
  • #*a
    Сопоставьте #с аргументом функции, получая длины подсписков. Результат:[3 4]
  • a/#*a
    Разделите (элементы) подсписки aна их соответствующие длины. Результат:[[0.667 1 1.333] [0.5 0.75 1 1.5]]
  • $+*a/#*a
    Карта $+(сложить при добавлении) к этому результату, суммируя подсписки. Результат:[3 3.75]
  • $CM$+*a/#*a
    Сложите CM, что дает -1, 0или в 1зависимости от сравнения двух его операндов (например, Python cmp). Результат: -1(потому что 3меньше чем 3.75).

Вы также можете определить функции в Pip, написав выражения, содержащие функцию тождества _. Например, _*_это функция, которая возводит в квадрат свой аргумент - синтаксический сахар {a*a}и меньше байтов. Однако в текущей версии интерпретатора есть ошибка, которая мешает _работе с *метаоператором. Как только это будет фиксированной, это решение может быть 11 байт : $CM$+*_/#*_.

DLosc
источник
2

C (gcc), 91 98 байтов

u,v,j;f(x,y,a,b)int*a,*b;{for(u=v=0;x--;u+=a[x])for(j=0;j<y;)v+=b[j++];j=u*y-v;x=j>0?2:!j;}

Неправильное место для C и, вероятно, единственный ответ, который не нуждается в делении. По крайней мере, код отображается без слайдера.

Возвращение 0,1,2 для M>N, M=N, M<Nсоответственно. Принимает входной сигнал , как length of M, length of N, M, N.

Кейу Ган
источник
Является ли длина в качестве аргумента в спецификации? Вырезает значительный код из многих из них, если он есть.
Генри
Я не знаю, есть ли другой способ для C получить длину массива. Сама длина больше похожа на внутреннюю часть массива.
Кейу Ган
2

Брахилог , 8 байт

⟨+/l⟩ᵐ-ṡ

Попробуйте онлайн!

Выводы, 1если первый список имеет большее среднее значение, -1если второй список имеет большее среднее значение, и 0если они связаны.

объяснение

     ᵐ        Map:
⟨   ⟩           Fork:
 +                Sum…
  /               …divided by…
   l              …length
       -      Subtract
        ṡ     Sign
Fatalize
источник
2

Java, 105 байт

s->s.stream().map(l->l.stream().reduce((i,j)->i+j).get()/l.size()).reduce((i,j)->Math.signum(i-j)).get();

Лямбда, которая принимает вложенный список, согласно допустимым входам.

Потоки списка списков, преобразует оба в их средние значения, а затем возвращает знак разницы. 1если первый список больше, -1если второй список больше, 0для связи.

Xanderhall
источник
Поскольку «все может быть входом», просто используйте Streams напрямую, как я .
Оливье Грегуар
2

R 38 34 байта

function(a,b)sign(mean(a)-mean(b))

Функция, которая принимает в качестве входных данных два числовых вектора. Возвращает 1, если первое среднее значение списка выше, 0, если они одинаковые, и -1, если второе среднее значение списка выше.

zelite
источник
1
Это анонимная функция, которую можно вызывать без присваивания? Я не знаю R, но если это так, то вам не нужно f=.
Пшеничный волшебник
@WheatWizard вы правы; Кроме того, вы можете удалить {}из тела функции.
Джузеппе
Спасибо за вклад. Это моя первая попытка кодогольфа.
zelite
2

MATL , 6 байтов

Не будь таким злым! *

!-ssZS

Порядок ввода стека:

M
N

Выход:

 1 = N wins  
-1 = M wins  
 0 = tie

Попробуйте онлайн!

!-ssZS
========
!           % transpose M
 -          % N - M^T using elementwise subtraction and implicit expansion
  s         % sum columns of the result
   s        % sum the resulting row vector
    ZS      % sign of the sum

* Этот ответ был в гольфе, не будучи злым для бедных, беззащитных чисел.

мерный стакан
источник
2

Java (OpenJDK 8) , 76 62 байта

a->b->Math.signum(a.average().orElse(0)-b.average().orElse(0))

Попробуйте онлайн!

Поскольку вход может быть любым, я решил взять IntStreams в качестве ввода. Вы можете получить такой вход от стандарта int[]сArrays.stream(array) .

Выход 1для «N побед», -1для «М выигрышей» и0 для ничьей.

Сохраняет

  • -14 байтов из идей @Zircon и @Xanderhall!
Оливье Грегуар
источник
Способ, который вы выбрали, действительно умный!
Дэвид Конрад
1
@DavidConrad У меня на самом деле была длинная версия этого ответа со вчерашнего дня (просто prepend java.util.Arrays.stream(array).map(java.util.Arrays::stream)). Только когда я перечитал вопрос сегодня, я подумал, что этот формат ввода так же действителен, как и любой другой.
Оливье Грегуар
1
Будет .orElse(0)ли жизнеспособное сокращение .getAsDouble()?
Циркон
1
Если вместо этого просто взять 2 потока для ввода, (a,b)->Math.signum(a.average().orElse(0)-b.average().orElse(0));это 64 байта
Xanderhall
Это только хорошие идеи, ребята! Продолжить: p
Оливье Грегуар
1

Dyalog APL, 14 байтов

×(-/(+/÷≢)¨∘⊢)

1если левый больше, ¯1если правый и 0на галстуке.

Как?

¨∘⊢ для каждого списка

+/÷≢рассчитать среднее ( +/сумма ÷делится на длину)

-/ вычесть средние

× признак результата

Уриэль
источник