Zsumuj średnie z dwóch liczb całkowitych

12

W matematyce jest całkiem sporo środków, takich jak średnia arytmetyczna, średnia geometryczna i wiele innych ...

Definicje i zadania

Zauważ, że są to definicje dwóch dodatnich liczb całkowitych *:

  • Średni kwadratowy wynosi pierwiastek kwadratowy z sumy kwadratów ich o połowę ( ).

  • Arytmetyczna jest ich suma, o połowę ( ).

  • Średnia geometryczna jest pierwiastek kwadratowy ich produktu ( ).

  • Średnia harmoniczna jest 2 podzieloną przez sumę ich odwrotne ( = ).

Biorąc pod uwagę dwie liczby całkowite a i b, takie, że a, b ∈ [1, + ∞) , sumują średnie wspomniane powyżej a i b . Twoje odpowiedzi muszą być dokładne z dokładnością do co najmniej 3 miejsc po przecinku, ale nie musisz się martwić błędami zaokrąglania lub zmiennoprzecinkowymi.

Przypadki testowe

a, b -> Dane wyjściowe

7, 6 -> 25,961481565148972
10, 10 -> 40
23, 1 -> 34,99131878607909
2, 4 -> 11,657371451581236
345, 192 -> 1051,7606599443843

Możesz zobaczyć poprawne wyniki dla większej liczby przypadków testowych za pomocą tego programu . To jest , więc wygrywa najkrótsza ważna wersja zgodna ze standardowymi zasadami.

* Istnieje wiele innych środków, ale do celów tego wyzwania użyjemy tych wymienionych w sekcji „Definicje”.

Pan Xcoder
źródło
Związane z.
Martin Ender
10
Musiałem poprosić o podanie średniej środków. -1 (nie).
mój zaimek to monicareinstate
9
Przynajmniej nie ma do tego wbudowanej Mathematiki. Dobrze?
NieDzejkob
@NieDzejkob Nie sądzę :-)
Pan Xcoder
@NieDzejkob Chociaż podejrzewam, że są wbudowane dla każdego ze środków.
Erik the Outgolfer

Odpowiedzi:

13

Haskell , 48 bajtów

a%b=sum[((a**p+b**p)/2)**(1/p)|p<-[2,1,-1,1e-9]]

Wypróbuj online!

Ta wykorzystuje fakt, że root-kwadrat, arytmetyka, harmoniczna i geometryczna środki są wszystkie szczególne przypadki uogólnionej średnia ((a**p+b**p)/2)**(1/p) dla p=2,1,-1,0. Średnia geometryczna wykorzystuje limit p->0+, przybliżony jako p=1e-9wystarczający do precyzji.

xnor
źródło
9

Mathematica , 37 bajtów

-2 bajty dzięki Martinowi Enderowi. -6 bajtów dzięki Jenny_mathy i wielokrotnego użytku funkcji dzięki JungHwan Min.

(t=1##)^.5+(2(s=+##/2)^2-t)^.5+s+t/s&

Wypróbuj online!

Mathematica , 55 bajtów

RootMeanSquare@#+Mean@#+GeometricMean@#+HarmonicMean@#&

Wypróbuj online!

¯ \ _ (ツ) _ / ¯

całkowicie ludzki
źródło
1
Alternatywa:((#^2+#2^2)/2)^.5+(#+#2)/2+(#1#2)^.5+2#*#2/(#+#2)&
Pan Xcoder,
1
2 bajty wyłączone:((#^2+#2^2)/2)^.5+(+##)/2+(1##)^.5+2/(1/#+1/#2)&
Martin Ender
2
42 bajty: (((s=+##)^2-2##)/2)^.5+s/2+(1##)^.5+2##/s&
J42161217
6
37 bajtów: (2(s=+##/2)^2-t)^.5+s+(t=1##)^.5+t/s&
J42161217
2
Nieznaczne poprawka do wersji Jenny_mathy @'S (sama liczba bajtów) (t=1##)^.5+(2(s=+##/2)^2-t)^.5+s+t/s&. Aby ułatwić ponowne użycie funkcji (bez konieczności uruchamiania Clear@tprzed każdą iteracją).
JungHwan Min
5

Python 3 , 57 bajtów

lambda a,b:(a+b+(a*a+b*b<<1)**.5)/2+(a*b)**.5+2*a*b/(a+b)

Wypróbuj online!

orlp
źródło
<<1Jedzie nieprawidłowo obciąć do liczby całkowitej, gdy ai bsą przeciwne parytety.
xnor
@ xnor Nie, to nie jest :) Myślisz o tym >>1.
orlp
1
Och, mój błąd! Widzę, że teraz jest coś /2, co to kompensuje. Niezła sztuczka.
xnor
4

R , 52 bajty

function(a,b,m=(a+b)/2,p=a*b)m+p^.5+(m^2*2-p)^.5+p/m

Wypróbuj online!

Giuseppe
źródło
3

Haskell , 48 bajtów

a?b|s<-a+b,p<-a*b=s/2+sqrt(s^2/2-p)+sqrt p+2*p/s

Wypróbuj online!

Wyjaśnienie:

s/2 = (a+b)/2: Średnia arytmetyczna.

sqrt(s^2/2-p) = sqrt((a^2+2*a*b+b^2)/2-a*b) = sqrt((a^2+b^2)/2): Średni kwadrat pierwiastkowy.

sqrt p = sqrt(a*b). Średnia geometryczna.

2*p/s = 2*a*b/(a+b). Średnia harmoniczna.

H.PWiz
źródło
3

Oktawa , 44 42 41 bajtów

@(n)(q=mean(n))+rms(n)+(z=prod(n))^.5+z/q

Wypróbuj online!

Zauważ, że TIO nie ma zainstalowanego pakietu sygnałów, więc zdefiniowałem to rms()w nagłówku. W Octave Online możesz spróbować, jeśli chceszpkg load nan . Nie jestem pewien, czy są jakieś interpretery online, które ładują go domyślnie, ale większość systemów domyślnie miałaby ten pakiet ładowany.

Podziękowania dla Toma Carpentera za wykrycie małego błędu 2 bajtów.

Definiuje to anonimową funkcję, przyjmującą dane wejściowe jako wektor n=[a,b]. Następnie używamy przypisania wbudowanego, aby zmniejszyć obliczenia HM do just z/q.

Sanchises
źródło
1
Nie musisz dołączać f=kodu do kodu, dzięki czemu ma on 42 bajty. (co oczywiście prowadzi do „przekreślonego 44 wygląda jak 44”) - Wypróbuj online!
Tom Carpenter
Ojej, to artefakt z kopiowania go z Octave-Online! Dzięki.
Sanchises
TIO domyślnie ładuje zainstalowane pakiety, po prostu nie ma zainstalowanego pakietu Signal
Luis Mendo
@LuisMendo Dokładnie, uważam, że de facto standardem MATLAB i Octave jest założenie, że wszystkie pakiety są zainstalowane i załadowane.
Sanchises
^.5 zapisuje bajt nad sqrt. Usuń f=także część kodu w linku
Luis Mendo
2

Galaretka , 17 bajtów

²Æm,P½S
PḤ÷S+Ç+Æm

Wypróbuj online!

Erik the Outgolfer
źródło
Ładna kombinacja linków. Najlepsze, co mogłem zrobić w jednym wierszu, to PḤ÷S,µ³²Æm,P½,µÆmFS(19 bajtów) - myślę, że warto o tym wspomnieć, może jest to źródło inspiracji. EDYCJA: > _> Teraz zdaję sobie sprawę, że mogę po prostu użyć +zamiast,
Mr. Xcoder
@ Mr.Xcoder Miałem na początku wersję 18-bajtową (nie w historii wersji), ale potem pomyślałem, aby połączyć te wszystkie ½razem i to uratowało bajt.
Erik the Outgolfer
Innym możliwym źródłem inspiracji: PḤ÷Smoże zostać zastąpiony przez:İSHİ
pana Xcodera
@ Mr.Xcoder też o tym pomyślał
Erik the Outgolfer
2

05AB1E , 18 16 bajtów

-2 bajty dzięki Erikowi Outgolfer

nO;t¹O;¹Pt2¹zO/O

Wyjaśnienie:

nO;t                Root mean square
n                    Raise [a, b] to [a ** 2, b ** 2]
 O                   Sum
  ;                  Half
   t                 Square root
    ¹O;             Arithmetic mean
    ¹                Retrieve stored [a, b]
     O               Sum
      ;              Half
       ¹Pt          Geometric mean
       ¹             Retrieve stored [a, b]
        P            Product
         t           Square root
          2¹zO/     Harmonic mean
           ¹         Retrieved stored [a, b]
            z        Vectorised inverse to [1 / a, 1 / b]
             O       Sum
          2   /      Get 2 divided by the sum
               O    Sum of all elements in stack

Wypróbuj online!

Okx
źródło
nO;t¹O;¹Pt2¹zO/O
Erik the Outgolfer
@EriktheOutgolfer Nie sądzę, że to działa.
Okx,
Weź dane jako listę [a, b].
Erik the Outgolfer
@EriktheOutgolfer Oczywiście! Dlaczego o tym nie pomyślałem.
Okx
2

Łuska , 19 bajtów

ṁëȯ√½ṁ□o½Σo√Π§/ΣoDΠ

Wypróbuj online!

-1 dzięki H.PWiz .

Erik the Outgolfer
źródło
ö√½Σm□może byćȯ√½ṁ□
H.PWiz
@ H.PWiz> _> Wiedziałem, że coś zapomnę
Erik the Outgolfer
18 bajtów
H.PWiz
@ H.PWiz wciąż się uczy! : p
Erik the Outgolfer
2

MATL , 21 18 17 bajtów

UYmGphX^GYmGpy/vs

Wypróbuj online!

-3 bajty dzięki Luisowi Mendo.

Wyjaśnienie

UYm               % Mean of squares, 
                  % Stack: { (a^2+b^2)/2 }
   Gp             % Product of input, a*b
                  % Stack: { (a^2+b^2)/2, a*b }
     hX^          % Concatenate into array, take square root of each element.
                  % Stack: { [RMS, HM] } 
        GYm       % Arithmetic mean of input.
                  % Stack: { [RMS,GM], AM }
           Gpy    % Product of input, duplicate AM from below.
                  % Stack: { [RMS,GM], AM, a*b, AM
              /   % Divide to get HM
                  % Stack { [RMS,GM], AM, HM}
               vs % Concatenate all to get [RMS,GM,AM,HM], sum.
Sanchises
źródło
2

Ohm v2 , 16 bajtów

²Σ½¬³Π¬³Σ½D³Πs/Σ

Wypróbuj online!

Wyjaśnienie

square sum halve sqrt input product sqrt input sum halve dupe input product swap div sum

... jeśli Ohm miałby rodzaj gadatliwy. : P

²Σ½¬³Π¬³Σ½D³Πs/Σ

                  implicit input       [[7, 6]]
²Σ½¬              root mean square
²                  square              [[49, 36]]
 Σ                 sum                 [85]
  ½                halve               [42.5]
   ¬               square root         [6.519]
    ³Π¬           geometric mean
    ³              push first input    [6.519, [7, 6]]
     Π             product             [6.519, 42]
      ¬            square root         [6.519, 6.481]
       ³Σ½        arithmetic mean
       ³           push first input    [6.519, 6.481, [7, 6]]
        Σ          sum                 [6.519, 6.481, 13]
         ½         halve               [6.519, 6.481, 6.500]
          D³Πs/   harmonic mean
          D        duplicate           [6.519, 6.481, 6.500, 6.500]
           ³       push first input    [6.519, 6.481, 6.500, 6.500, [7, 6]]
            Π      product             [6.519, 6.481, 6.500, 6.500, 42]
             s     swap                [6.519, 6.481, 6.500, 42, 6.500]
              /    divide              [6.519, 6.481, 6.500, 6.461]
               Σ  sum                  [25.961]
                  implicit output      [25.961]
całkowicie ludzki
źródło
1
Jestem pewien, że jakiś czas temu dodałem wbudowany środek arytmetyczny, ale nie zaoszczędziłby tutaj żadnych bajtów.
Nick Clifford
2

TI-Basic (TI-84 Plus CE), 27 25 bajtów

√(sum(Ans2)/2)+mean(Ans)+2prod(Ans)/sum(Ans)+√(prod(Ans

-2 bajty od Scrooble

Pobiera listę dwóch liczb Ansi domyślnie zwraca sumę czterech średnich; np. biegnij z, {7,6}:prgmNAMEaby dostać 25.96148157.

Wyjaśnienie:

√(sum(Ans2)/2): 8 bajtów: średnia kwadratowa

mean(Ans): 5 3 bajty: średnia arytmetyczna (stara sum(Ans)/2:)

2prod(Ans)/sum(Ans): 8 bajtów: średnia harmoniczna

√(prod(Ans: 3 bajty: średnia geometryczna

+3 bajty na 3 +es

pizzapanty184
źródło
Wydaje mi się, że masz dodatkowy niedopasowany nawias zamykający tutaj po 2 w sum(Ans)/2).
kamoroso94
@ kamoroso94 Naprawiono, dziękuję.
pizzapants184
Zaoszczędź dwa bajty dzięki mean(wbudowanemu.
Khuldraeseth na'Barya
1

Dyalog APL , 44 bajty

{+/(2×o÷k),(.5×k←⍺+⍵),.5*⍨(o←⍺×⍵),.5×+/⍺⍵*2}

Wypróbuj online!

Dyadic dfns z apo lewej i bpo prawej stronie.

Uriel
źródło
1

JavaScript, 47 bajtów

a=>b=>(c=a+b)/2+(c*c/2-(d=a*b))**.5+d**.5+2*d/c

całkiem trywialne

tsh
źródło
1

Java 8, 63 bajty

a->b->Math.sqrt((a*a+b*b)/2)+(a+b)/2+Math.sqrt(a*b)+2/(1/a+1/b)

Pobiera zarówno parametry jak Doublei wyjścia jako Double.
Wypróbuj tutaj.

Lub (także 63 bajty ):

a->b->(a+b+Math.sqrt(a*a+b*b<<1))/2+Math.sqrt(a*b)+2d*a*b/(a+b)

Pobiera zarówno parametry jak Integeri wyjścia jako Double.
Wypróbuj tutaj.

Kevin Cruijssen
źródło
1

ARBLE , 49 45 bajtów

-4 bajty dzięki Mr. Xcoder

((a^2+b^2)/2)^.5+(a+b)/2+(a*b)^.5+2*a*b/(a+b)

Wypróbuj online!

ATaco
źródło
45 bajtów
Mr. Xcoder
1

Właściwie 15 bajtów

æßπ√+ßΣßπτ/+ßµ+

Wypróbuj online!

Yay Właściwie ma wbudowany Root Square Mean!

æßπ√ + ßΣßπτ / + ßµ + ~ Pełny program.

æ ~ Średnia arytmetyczna.
 ßπ√ ~ Produkt, pierwiastek kwadratowy (oblicza średnią geometryczną).
    + ~ Dodawanie.
     ßΣ ~ Naciśnij sumę wejścia.
       ßπτ ~ Wciśnij iloczyn iloczynu wejściowego.
          / ~ Podziel.
           + ~ Dodawanie.
            ßµ ~ Push Root Square Mean.
              + ~ Dodawanie.
Pan Xcoder
źródło
1

Julia , 49 47 bajtów

a$b=(x=a+b)/2+((a^2+b^2)/2)^.5+(y=a*b)^.5+2*y/x

Wypróbuj online!

Uriel
źródło
1

Groovy, 54 bajty

{a,b->c=a+b;((a*a+b*b)/2)**0.5+c/2+(a*b)**0.5+2*a*b/c}

-2 dzięki Mr. Xcoder za edycję, która sprawiła, że ​​poczułem się głupio.

Urna Magicznej Ośmiornicy
źródło
1
Myślę, że można zastąpić a**2z a*ai b**2zb*b
pana Xcoder
0

Jq 1,5 , 76 bajtów

[pow((map(pow(.;2))|add)/2;.5),add/2,pow(.[0]*.[1];.5),2/(map(1/.)|add)]|add

Rozszerzony

[
  pow((map(pow(.;2))|add)/2;.5)  # root mean square
, add/2                          # arithmetic mean
, pow(.[0]*.[1];.5)              # geometric mean
, 2/(map(1/.)|add)               # harmonic mean
]
| add                            # that just about sums it up for mean

Wypróbuj online!

jq170727
źródło