Порівняйте середні показники моїх списків


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] -> Краватка (обоє мають 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)

Застосовуються лазівки за замовчуванням . Пояснення заохочуються! Це , тому найкоротший код у байтах виграє!



якщо моя обрана мова підтримує лише цілі числа, чи можу я взяти вхід, помножений на 1000? Таким чином, обчислені середні показники все одно будуть точними до 3 знаків після коми
Skidsdev

@Mayube Так, це дозволено
містер Xcoder

Ми повинні повернути висновок щонайменше 1 символу. Чи означає це, що нам потрібно повернути символ чи рядок? Або ви маєте на увазі вихід, значення рядка якого становить щонайменше 1 символ?
Олів'є Грегоар

@ OlivierGrégoire Даний вихід повинен бути не менше 1 символу (ви не можете повернути порожню рядок, але можете повернути будь-яку рядок щонайменше з 1 символу, а також будь-який символ, що не має пробілів). Тобі вирішувати.
Містер Xcoder

Відповіді:



15

Математика, 15 байт

Order@@Mean/@#&

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

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


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 приводить до нескінченності , -інфінітію або NaN - надання трьох різних значень, як потрібно.

Випробування:


Чи можете ви зберегти пару байтів, перемістившись Aдо параметрів функції?
Shaggy


5

MATL , 8 байт

Soooo багато модифікаторів ( 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якщо другий вхід більший.







3

APL (Dyalog) , 11 байт

Запрошення до списку з двох списків. Друкує, 1якщо ліва має вищу середню, 0, якщо вони мають однакове середнє значення, а ¯1якщо права має вищу середню.

×-/(+/÷≢)¨⎕

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

 підказка

( Застосувати таку негласну функцію до кожного:

+/ сума

÷ ділиться на

 підрахунок

-/ вставити (і оцінити) мінус між ними

× signum


3

Javascript, 81 66 58 56 байт

врятувало 15 байт завдяки Луці

зберегли 2 байти завдяки Джастіну Марінеру

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

Краватка дорівнює 0, M дорівнює 1 і N дорівнює -1. Називається за допомогою синтаксису currying, напр.f([7])([6])


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 байти завдяки німі!

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).
німі

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якщо вони рівні.

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


Можна зберегти байт, замінивши h.+на-F
isaacg

3

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

-2 байти завдяки ліртосіасту

:tanh(ᴇ9mean(L₁-mean(L₂

2
Це можна пограти в гольф, використовуючи Ansзамість C:, mean(L₁)>mean(L₂:Ans+3(mean(L₁)=mean(L₂21 байт.
Скотт Мілнер

Ви можете видалити (і ).
lirtosiast

2

Желе , 7 байт

S÷Lµ€IṠ

Монадійне посилання, що приймає список двох списків, N,Mяке повертається:
[-1]для 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. :)
Erik the 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

Приймає дані як двоелементний масив [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$+*_/#*_.


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

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для краватки.


Оскільки "будь-що може бути вкладом", просто використовуйте Streams безпосередньо, як я .
Олів'є Грегоар

2

R 38 34 байт

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

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


1
Is this an anonymous function that can be called without assignment? I don't know R but if it is you don't need the f=.
Post Rock Garf Hunter

@WheatWizard you are correct; additionally you can remove the {} from the function body.
Giuseppe

Thanks for the input. It's my first attempt at codegolf.
zelite

2

MATL, 6 bytes

Don't be so mean!*

!-ssZS

Input stack order:

M
N

Output:

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

Try it online!

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

*This answer was golfed without being mean to any poor, defenseless numbers.


2

Java (OpenJDK 8), 76 62 bytes

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

Try it online!

Since the input can be anything, I decided to take IntStreams as input. You can get such an input from a standard int[] with Arrays.stream(array).

The output is 1 for "N wins", -1 for "M wins", and 0 for tie.

Saves

  • -14 bytes from insights of both @Zircon and @Xanderhall!

The way you've chosen to take the input is really clever!
David Conrad

1
@DavidConrad I actually had the long version of this answer since yesterday (just prepend java.util.Arrays.stream(array).map(java.util.Arrays::stream)). It's only when I re-read the question today that I thought this input format is as valid as any.
Olivier Grégoire

1
Would .orElse(0) be a viable shortening of .getAsDouble()?
Zircon

1
If you instead just take 2 streams for input, (a,b)->Math.signum(a.average().orElse(0)-b.average().orElse(0)); is 64 bytes
Xanderhall

These are only good ideas, guys! Continue :p
Olivier Grégoire

1

Dyalog APL, 14 bytes

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

1 if the left is greater, ¯1 if the right is and 0 on tie.

How?

¨∘⊢ for each list

+/÷≢ calculate average (+/ sum ÷ divide by length)

-/ subtract the averages

× sign of the result


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.