Porównaj średnie z moich list

18

Uzyskiwanie średniej z listy (np. [2,6,7])

  • Uzyskaj długość listy: [2,6,7] -> 3
  • Podsumowując numery na liście: 2 + 6 + 7 = 15.
  • Podzielenie sumy przez ich ilość: 15 / 3 = 5.

Powinieneś porównać średnie z dwóch list dodatnich liczb całkowitych N i M , zwracając wartość, jeśli N ma wyższą średnią, inną wartość, jeśli M ma wyższą średnią, a drugą w przypadku remisu.


Zasady we / wy

Wszystkie standardowe metody wejścia i wyjścia są dozwolone.

Wejście

Możesz wziąć dane wejściowe jako dwie osobne listy, listę zagnieżdżoną lub cokolwiek innego, co uważasz za odpowiednie dla zadania. Proszę podać format.

Wynik

Podane wartości muszą być odrębne i muszą składać się z co najmniej jednego znaku spacji. Ponadto muszą być spójne między przebiegami (pojedyncza wartość dla N , pojedyncza wartość dla M , pojedyncza wartość dla Tie ). Podaj je w swojej odpowiedzi. Wartości mogą być niepustymi ciągami, wartościami Bool, liczbami całkowitymi lub cokolwiek, co uważasz za odpowiednie.


Okular

  • Listy niekoniecznie będą miały taką samą długość.

  • Masz gwarancję, że listy nie są puste.


Przypadki testowe

Wybrałem wartości N wins, M winsoraz Tie, które są bardzo oczywiste.

N, M -> Dane wyjściowe (średnie)

[7], [6] -> N wygrywa (N ma 7, M ma 6)
[4,5], [4,4] -> N wygrywa (N ma 4,5, M ma 4)
[2,3,4], [4,5,6] -> M wygrywa (N ma 3, M ma 5)
[4,1,3], [7,3,2,1,1,2] -> Remis (oba mają 2,666 ...)
[100.390,1], [89.82,89] -> N wygrywa (N ma 163,666 ..., M ma 86,666 ...)
[92, 892], [892,92] -> Remis (listy są w zasadzie identyczne) 
[10,182], [12,78,203,91] -> Krawat (oba mają 96)

Obowiązują domyślne luki . Wyjaśnienia są zachęcane! To jest , więc wygrywa najkrótszy kod w bajtach!

Pan Xcoder
źródło
Piaskownica .
Mr. Xcoder,
jeśli mój wybrany język obsługuje tylko liczby całkowite, czy mogę pobrać dane pomnożone przez 1000? W ten sposób obliczone średnie nadal byłyby dokładne z dokładnością do 3 miejsc po przecinku
Skidsdev
@Mayube Tak, to jest dozwolone
Mr. Xcoder,
Musimy zwrócić wynik o wartości co najmniej 1 znaku. Czy to oznacza, że ​​musimy zwrócić znak lub ciąg? Czy masz na myśli wynik, którego wartość ciągu wynosi co najmniej 1 znak?
Olivier Grégoire,
@ OlivierGrégoire Podane dane wyjściowe muszą mieć co najmniej 1 znak (nie można zwrócić pustego ciągu, ale można zwrócić dowolny Ciąg o długości co najmniej 1 znaku, a także dowolny znak inny niż biały) To zależy od Ciebie.
Pan Xcoder,

Odpowiedzi:

4

Właściwie 5 bajtów

♂æi-s

Wypróbuj online!

1dla N > M, 0dla N = M, -1dla N < M.

Wyjaśnienie:

♂æi-s Takes input in format [N, M]
♂æ    Map average
  i   Dump to stack in reverse
   -  Subtract
    s Get sign
Erik the Outgolfer
źródło
15

Mathematica, 15 bajtów

Order@@Mean/@#&

Wypróbuj online!

Functionktóra oczekuje listy dwóch list. Mean/@#przyjmuje średnią arytmetyczną każdej listy z danych wejściowych, a następnie te środki są przekazywane do Order, która zwraca, -1jeśli pierwsza lista wygra, 0jeśli istnieje remis i 1jeśli druga lista wygra.

ngenisis
źródło
7

JavaScript (ES6), 52 50 bajtów

(Zaoszczędź 2 bajty dzięki @Shaggy.)

Oto dwa 50-bajtowe rozwiązania:

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

Zwraca Infinity dla N, -Infinity dla M i NaN dla remisu.

Pierwsze rozwiązanie może wymagać nieco wyjaśnienia z powodu rekurencji:

Przy pierwszym wywołaniu funkcji ainicjowana jest jako średnia Ntablicy:

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

M ma wartość w tym momencie, więc pierwsza część wyrażenia warunkowego nazywa się:

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

Funkcja jest wywoływana w tej wypowiedzi, tym razem zastępując Mna N.

Przy drugim wywołaniu funkcji ainicjalizowana jest jako średnia N–– Mz poprzedniego wywołania.

Ponieważ podczas wywołania funkcji nie ma drugiego parametru, wyzwalana jest druga część wyrażenia warunkowego, która zwraca średnią:

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

Teraz możemy lepiej zrozumieć wyrażenie:

(a - f(M)) / 0

Jego:

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

Różnica między średnimi będzie liczbą dodatnią, liczbą ujemną lub 0.

Podzielenie różnicy przez 0 prowadzi do nieskończoności , -Infinity lub NaN - dostarczanie trzy różne wartości, w razie potrzeby.

Przypadki testowe:

Rick Hitchcock
źródło
Czy możesz zapisać kilka bajtów, przechodząc Ado parametrów funkcji?
Kudłaty
5

Mathematica, 21 bajtów

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

1 za #wygrane, -1 za #2wygrane, 0 za remis.

CalculatorFeline
źródło
lub równie długoSign[#-#2&@@Mean/@#]&
Greg Martin
5

MATL , 8 bajtów

Wymień wiele modyfikatorów ( Yi Z). Nie mogę znaleźć sposobu, aby go skrócić. sum / number_of_elementsto trzy bajty. Może to być lepszy sposób -ZS, ale nie mogę go znaleźć.

YmiYm-ZS

Wypróbuj online!

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

Zwraca, 1jeśli pierwsze wejście jest większe, 0jeśli łączą się, a -1jeśli drugie wejście jest większe.

Stewie Griffin
źródło
5

05AB1E , 9 bajtów

1 jeśli Mwygrywa, -1 jeśli Nwygrywa i 0 za remis.

vyOyg/}.S

Wypróbuj online!

Wyjaśnienie

v           # for each y in list of lists
 yO         # sum y
   yg       # get length of y
     /      # divide
      }     # end loop
       .S   # compare
Emigna
źródło
5

Julia , 27 bajtów

(x,y)->cmp(mean(x),mean(y))

Wypróbuj online!

Zwraca, 1jeśli pierwsza średnia jest większa, -1jeśli druga jest i 0jeśli wiążą się.

Uriel
źródło
3

Oktawa , 27 bajtów

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

Wypróbuj online!

Pobiera dwa wektory x.yjako dane wejściowe, bierze meanoba wektory i odejmuje jeden od drugiego. Uzyskaj znak tego, aby dostać 1, 0a -1dla trzech różnych alternatyw.

Stewie Griffin
źródło
3

Python 2, 49 bajtów

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

Wypróbuj online

mbomb007
źródło
„... [trzy wyjścia] muszą być spójne między seriami”
Jonathan Allan,
3
@JonathanAllan Naprawiono
mbomb007
3

APL (Dyalog) , 11 bajtów

Monituje o listę dwóch list. Drukuje, 1jeśli lewa ma wyższą średnią, 0, jeśli mają taką samą średnią, a ¯1jeśli prawa ma wyższą średnią.

×-/(+/÷≢)¨⎕

Wypróbuj online!

 skłonić

( Zastosuj następującą funkcję ukrytą dla każdego:

+/ Suma

÷ podzielony przez

 podsumowanie

-/ wstaw (i oceń) minus między nimi

× signum

Adám
źródło
3

JavaScript, 81 66 58 56 bajtów

zaoszczędził 15 bajtów dzięki Łukaszowi

zapisane 2 bajty dzięki Justin Mariner

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

Krawat to 0, M to 1, a N to -1. Wywoływany przy użyciu składni curry, np.f([7])([6])

SuperStormer
źródło
1
Możesz to poprawić o kilka bajtów: możesz usunąć przypisanie zmiennej, możesz użyć składni curry, możesz usunąć alert i możesz z łatwością sumować tablice za pomocą eval(a.join`+`). a=>(b=a.map(c=>eval(c.join`+`)/c.length))[0]-b[1]?b[0]>b[1]:0dla 61 bajtów. Pobiera dane wejściowe jako tablicę tablic i dane wyjściowe 0dla remisu, truedla M i falseN.
Łukasz
dlaczego nie opublikujesz go jako własnej odpowiedzi?
SuperStormer,
1
Można zaoszczędzić kolejne dwa bajty przez inline funkcję ( a) po raz pierwszy jest używany: n=>m=>Math.sign((a=b=>eval(b.join`+`)/b.length)(m)-a(n)).
Justin Mariner,
3

Haskell, 65 43 bajtów

Zaoszczędź 22 bajty dzięki nim!

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

Musi być o wiele lepszy sposób ... Ale przerobiły mnie konwersje typu.

Stosowanie

(#) [7] [6]

Zwraca, GTjeśli pierwszy argument wygrywa, LTjeśli drugi argument wygrywa i EQjeśli wiążą się.

Wypróbuj online!

Henz
źródło
1
Nie musisz rzucać za sum$xpomocą f.. Też: length xmożna zastąpić sum[1|_<-x], więc można pozbyć się fcałkowicie: a x=sum x/sum[1|_<-x].
nimi
Ach miło! Nawet nie pomyślałem o tym.
Henry
1
... no i #: ...(a x)$a y.
nimi
1
... jeszcze lepiej: przejdź pointfree ze swojej głównej funkcji, a następnie można również zapisać nazwy dla niej: (.a).compare.a. Zastosowanie: ( (.a).compare.a ) [7] [6].
nimi
2
Jeszcze jedno: [1|_<-x]jest taki sam jak (1<$x).
nimi
3

J, 10 bajtów

*@-&(+/%#)

Jedna lista podana po lewej, jedna po prawej. Zwróci _1 jeśli lewa średnia jest mniejsza, 1 jeśli jest większa, a 0 jeśli są równe

  • (+/%#) jest standardowym widelcem J do obliczania średniej z listy
  • &zapewnia odmianę dyadycznego widelca. stosuje prawą stronę (w tym przypadku średni czasownik) do obu argumentów, a następnie przekazuje je wraz z czasownikiem po lewej stronie, która w tym przypadku jest ...
  • *@- odejmij, a po nim „znak”: więc średnia avg jest odejmowana od lewej, a my otrzymujemy znak wyniku - _1, 1 lub 0
Jonasz
źródło
3

Pyth, 10 8 7 6 bajtów

Dzięki @isaacg za uratowanie bajtu

._-F.O

Wejście jest traktowana jako zagnieżdżonej listy [N, M]. Dane wyjściowe, -1jeśli N < M, 1jeśli N > Mi 0jeśli są one równe.

Wypróbuj online

Jakub
źródło
Można zapisać bajt zastępując h.+z-F
isaacg
3

TI-Basic, 25 21 13 12 10 bajtów

-2 bajty dzięki lirtosiast

:tanh(ᴇ9mean(L₁-mean(L₂
OK
źródło
2
Można to zagrać w golfa, używając Anszamiast C: mean(L₁)>mean(L₂:Ans+3(mean(L₁)=mean(L₂21 bajtów.
Scott Milner,
Możesz usunąć (i ).
lirtosiast
2

Galaretka , 7 bajtów

S÷Lµ€IṠ

Monadyczny link akceptujący listę dwóch list, N,Mktóry zwraca:
[-1]dla N;
[1]dla M; i
[0]na remis.
Jako pełny program drukuje wynik (listy pojedynczy element wydrukować tylko ich treść, tak -1, 1albo 0).

Wypróbuj online!

W jaki sposób?

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)
Jonathan Allan
źródło
Wiedziałem, że Jelly będzie całkiem dobra w tym wyzwaniu, po prostu nie znam dobrze języka. Dobra robota po pokonaniu mnie: P
Okx
Nie jestem w 100% pewien, że nie jest to możliwe, powiedzmy, w 5 ...!
Jonathan Allan
@JonathanAllan I am? Zasadniczo, aby uzyskać średnie, mapujesz średnią funkcję, która nie jest jeszcze wbudowana, więc używasz najkrótszego (jak sądzę) odpowiednika S÷L, a następnie przekształcasz go w pojedynczy link, za pomocą S÷¥L$którego można go skrócić, S÷Lµponieważ jest na na samym początku programu, a potem umieściłeś tam prawo do mapowania, a potem, ponieważ nie ma wbudowanego narzędzia do porównywania, którego byś użył, _/Ṡale możesz skrócić, IṠponieważ wciąż są to 3 różne wyjścia cmp ... tak, całkiem pewne, że nie może być zrobione w 5. Również 5 nie pomoże, odkąd I FGITW. :)
Erik the Outgolfer,
2

Perl 6 , 25 bajtów

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

Wypróbuj online!

Bierze pojedynczy argument, dwuelementową listę list liczb. Zwraca, 1jeśli pierwsza lista ma wyższą średnią, -1jeśli druga lista ma, i 0jeśli średnie są równe.

Sean
źródło
2

JavaScript (ES6), 60 bajtów

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

Wyjścia 0dla Tie, truedla Ni falsedla M.

Łukasz
źródło
2

JavaScript (ES6), 60 54 bajtów

-6 bajtów dzięki @Luke i @Neil

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

Pobiera dane wejściowe jako tablicę 2-elementową [N, M]. Wyjścia true, 0albo falseza N, TiealboM , odpowiednio.

Wyjaśnienie

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

Test Snippet

Wprowadź liczby oddzielone spacjami / przecinkami.

Justin Mariner
źródło
1
Prawdopodobnie możesz zapisać niektóre bajty, zastępując Math.sign(y-x)je y-x?x>y:0. Wyjścia 0dla Tie, truedla Ni falsedla M.
Luke
1
x-y&&x>ybyć może?
Neil,
@Neil Nice, jeszcze lepiej
Justin Mariner
2

Pip , 13 bajtów

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

Jest to funkcja, która pobiera listę list. Zwraca, 1jeśli pierwsza średnia jest większa, -1jeśli druga jest większa, 0jeśli jest remis.Tutaj uruchom wszystkie przypadki testowe.

tło

To rozwiązanie intensywnie wykorzystuje dwa metaoperatory Pipa:

  • $, złóż. Weź operator binarny i zastosuj go między elementami listy. Na przykład,+ jest dodaniem, ale $+sumuje listę. Zauważ, że$ czyni operator binarny operatorem jednoargumentowym.
  • *mapa Weź jednoargumentowy operator i zastosuj go do każdego elementu listy. Na przykład #podaje długość listy, ale#* podaje (listę) długości elementów listy.
  • Te dwa metaoperatory można łączyć: $+* mapy składają się / na liście, sumując każdy z elementów listy.

Inną rzeczą, którą należy wiedzieć o Pip, jest to, że wielu operatorów domyślnie pracuje na listach. Na przykład [1 2 3] * 5daje [5 10 15]; [1 2 3] * [2 3 4]daje[2 6 12] ; i [[1 2] [3 4]] * [5 6]daje[[5 10] [18 24]] .

Wyjaśnienie

Użyjemy przykładowego wejścia [[2 3 4] [2 3 4 6]]:

  • {...}
    Definiuje funkcję. (Pierwszy) argument jest powiązany ze zmienną lokalną a.
  • #*a
    Odwzoruj #na argument funkcji, uzyskując długości list podrzędnych. Wynik:[3 4]
  • a/#*a
    Podziel (elementy) podlist aprzez ich odpowiednie długości. Wynik:[[0.667 1 1.333] [0.5 0.75 1 1.5]]
  • $+*a/#*a
    Zamapuj $+(dodaj po złożeniu) do tego wyniku, sumując listy podrzędne. Wynik:[3 3.75]
  • $CM$+*a/#*a
    Fold on CM, co daje -1, 0lub w 1zależności od porównania dwóch operandów (takich jak Python cmp). Wynik: -1(ponieważ 3jest mniejszy niż 3.75).

Możesz także zdefiniować funkcje w Pipie, pisząc wyrażenia zawierające funkcję tożsamości _. Na przykład _*_jest funkcją, która podnosi argument do kwadratu - cukier składniowy dla {a*a}i mniej bajtów. Jednak obecna wersja interpretera zawiera błąd, który uniemożliwia _pracę z *metaoperatorem. Raz, że jest stałe, to rozwiązanie może być 11 bajtów : $CM$+*_/#*_.

DLosc
źródło
2

C (gcc), 91 98 bajty

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;}

Niewłaściwe miejsce dla C i prawdopodobnie jedyna odpowiedź, która nie wymaga podziału. Przynajmniej kod jest wyświetlany bez suwaka.

Powrót do 0,1,2 M>N, M=N, M<Nodpowiednio. Zajmuje wejście jako length of M, length of N, M, N.

Keyu Gan
źródło
Czy uwzględnianie długości jako argumentu w specyfikacjach? Wycina znaczący kod z wielu z nich, jeśli tak jest.
Henry
Nie wiem, czy C ma inny sposób na odzyskanie długości tablicy. Sama długość bardziej przypomina nieodłączną część tablicy.
Keyu Gan,
2

Brachylog , 8 bajtów

⟨+/l⟩ᵐ-ṡ

Wypróbuj online!

Wyprowadza, 1jeśli pierwsza lista ma wyższą średnią, -1czy druga lista ma wyższą średnią i 0jeśli są powiązane.

Wyjaśnienie

     ᵐ        Map:
⟨   ⟩           Fork:
 +                Sum…
  /               …divided by…
   l              …length
       -      Subtract
        ṡ     Sign
Fatalizować
źródło
2

Java, 105 bajtów

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

Lambda, która pobiera listę zagnieżdżoną, zgodnie z dopuszczalnymi danymi wejściowymi.

Przesyła strumieniowo listę list, konwertuje obie wartości na ich średnie, a następnie zwraca znak różnicy. 1jeśli pierwsza lista jest większa, -1jeśli druga lista jest większa, 0dla remisu.

Xanderhall
źródło
Ponieważ „wszystko może być wejściem”, po prostu użyj Streams bezpośrednio, tak jak ja .
Olivier Grégoire
2

R 38 34 bajtów

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

Funkcja przyjmująca jako dane wejściowe dwa wektory numeryczne. Zwraca 1, jeśli średnia z pierwszej listy jest wyższa, 0, jeśli są takie same i -1, jeśli średnia z drugiej listy jest wyższa.

zelit
źródło
1
Czy to anonimowa funkcja, którą można wywołać bez przypisania? Nie znam R, ale jeśli tak, nie potrzebujesz f=.
Post Rock Garf Hunter
@WheatWizard masz rację; dodatkowo możesz usunąć {}z ciała funkcji.
Giuseppe,
Dzięki za wkład. To moja pierwsza próba kodegolfa.
zelite,
2

MATL , 6 bajtów

Nie bądź taki wredny! *

!-ssZS

Kolejność stosu wejściowego:

M
N

Wynik:

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

Wypróbuj 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

* Ta odpowiedź została zagrana w golfa, nie będąc wrednym dla żadnych biednych, bezbronnych liczb.

zlewka
źródło
2

Java (OpenJDK 8) , 76 62 bajtów

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

Wypróbuj online!

Ponieważ dane wejściowe mogą być dowolne, postanowiłem wziąć IntStreams jako dane wejściowe. Możesz uzyskać takie dane wejściowe ze standardu za int[]pomocąArrays.stream(array) .

Dane wyjściowe dotyczą 1„N zwycięstw”, -1„M zwycięstw” i0 remisu.

Oszczędza

  • -14 bajtów ze spostrzeżeń zarówno @Zircon, jak i @Xanderhall!
Olivier Grégoire
źródło
Sposób, w jaki zdecydowałeś się wziąć wkład, jest naprawdę sprytny!
David Conrad
1
@DavidConrad Właściwie miałem długą wersję tej odpowiedzi od wczoraj (tylko prepend java.util.Arrays.stream(array).map(java.util.Arrays::stream)). Dopiero kiedy ponownie przeczytam pytanie dzisiaj, pomyślałem, że ten format wejściowy jest tak samo ważny jak każdy.
Olivier Grégoire,
1
Czy .orElse(0)byłoby realne skrócenie .getAsDouble()?
Zircon
1
Jeśli zamiast tego weźmiesz tylko 2 strumienie na wejściu, (a,b)->Math.signum(a.average().orElse(0)-b.average().orElse(0));to 64 bajty
Xanderhall
To tylko dobre pomysły, chłopaki! Kontynuuj: p
Olivier Grégoire,
1

Dyalog APL, 14 bajtów

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

1jeśli lewy jest większy, ¯1jeśli prawy jest i 0na remis.

W jaki sposób?

¨∘⊢ dla każdej listy

+/÷≢oblicz średnią ( +/suma ÷podzielona przez długość)

-/ odejmij średnie

× znak wyniku

Uriel
źródło