Odfiltruj pseudoelementy!

15

Definiujemy hiper-średnią tablicy / listy (liczb) średnią arytmetyczną sum sum jej prefiksów.

Na przykład hiper-średnia listy [1, 4, -3, 10]jest obliczana w następujący sposób:

  • Otrzymujemy prefiksy: [1], [1, 4], [1, 4, -3], [1, 4, -3, 10].

  • Podsumowując każda: a [1, 5, 2, 12].

  • A teraz się średnią arytmetyczną z elementów tej listy: (1 + 5 + 2 + 12) / 4 = 5.

Pseudoelement tablicy jest elementem, którego wartość jest ściśle niższą od hiper-średniej. Stąd, pseudo-elementami listy przykładem są 1, 4i -3.


Biorąc pod uwagę listę liczb zmiennoprzecinkowych, Twoim zadaniem jest zwrócenie listy pseudoelementów.

  • Nie musisz się martwić o niedokładności zmiennoprzecinkowe.

  • Lista wejściowa nigdy nie będzie pusta i może zawierać zarówno liczby całkowite, jak i zmiennoprzecinkowe. Jeśli wspomniano, liczby całkowite mogą być traktowane jako zmiennoprzecinkowe (z <integer>.0)

  • Możesz założyć, że liczby pasują do twojego wybranego języka, ale proszę, nie nadużywaj tego w żaden sposób.

  • Opcjonalnie możesz również wziąć długość tablicy jako dane wejściowe.

  • To jest , więc obowiązują standardowe reguły dla tagu. Najkrótszy kod w bajtach ( w każdym języku ) wygrywa!


Przypadki testowe

Wejście -> Wyjście

[10,3] -> []
[5.4, 5.9] -> [5.4, 5.9]
[1, 4, -3, 10] -> [1, 4, -3]
[-300, -20,9, 1000] -> [-300, -20,9]
[3.3, 3.3, 3.3, 3.3] -> [3.3, 3.3, 3.3, 3.3]
[-289,93, 912,3, -819,39, 1000] -> [-289,93, -819,39]
Pan Xcoder
źródło
Jeśli niektóre języki mogą przyjmować długość tablicy jako dodatkowe dane wejściowe, powinno być dozwolone dla wszystkich języków .
ngenisis
1
@ngenisis To jest dla wszystkich języków. Jeśli również wydłużenie skróci Twój program, możesz to zrobić. Ta specyfikacja wcale nie ogranicza języka.
Mr. Xcoder,

Odpowiedzi:

7

MATL , 8 bajtów

ttYsYm<)

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

tt    % Implicitly input array. Duplicate twice
Ys    % Cumulative sum
Ym    % Arithmetic mean
<     % Less than? (element-wise). Gives an array containing true / false
)     % Reference indexing : use that array as a mask to select entries 
      % from the input. Implicitly display
Luis Mendo
źródło
7

05AB1E , 9 8 bajtów

-1 bajty dzięki Magic Octopus Urn

ηOO¹g/‹Ï

Wypróbuj online!

η        # Get prefixes
 O       # Sum each
  O¹g/   # Get the mean ( length(prefix list) equals length(original list) )
      ‹Ï # Keep only the value that are less than the mean

05AB1E , 6 bajtów

Korzystanie z nowego ÅApolecenia.

ηOÅA‹Ï

Wypróbuj online!

η      # Get prefixes
 O     # Sum each
  ÅA   # Get the mean
    ‹Ï #  Keep only the value that are less than the mean
Riley
źródło
2
ηOO¹g/›Ïdla 8; też zaczyna się od nOO!.
Magic Octopus Urn
5

Japt v2.0a0, 12 11 10 bajtów

f<Uå+ x÷Ul

Sprawdź to

  • 1 bajt zapisany dzięki ETH wskazującemu zbędny znak.

Wyjaśnienie

Domniemane wejście tablicy U.

f<

Filtruj ( f) tablicę, sprawdzając, czy każdy element jest mniejszy niż ...

Uå+

Ukumulatywnie zredukowane ( å) poprzez zsumowanie ...

x

Z kolei wynikową tablicę zmniejszamy sumując ...

/Ul

I podzielone przez długość ( l) z U.

Niejawnie wypisuje wynikową tablicę.

Kudłaty
źródło
4

Python 3 z Numpy , 48 bajtów

lambda x:x[x<mean(cumsum(x))]
from numpy import*

Wejścia i wyjścia to tablice Numpy. Wypróbuj online!

Luis Mendo
źródło
1
+1 Wreszcie ktoś używa cumsum!
Pan Xcoder
3

Galaretka , 9 bajtów

+\S÷L<Ðf@

Wypróbuj online!

Leaky Nun
źródło
Może <Ðf@zamiast tego powinno być <Ðḟ@?
Erik the Outgolfer
@EriktheOutgolfer, ale przechodzi wszystkie przypadki testowe.
Leaky Nun
Nadal coś nie wydaje mi się dobre ... po pierwsze +\S÷Loblicza hiper-średnią, a następnie <Ðf@umieszcza ją jako właściwy argument i <zwraca, 1jeśli element jest pseudoelementem, zasadniczo filtrując pseudoelementy zamiast filtrować je.
Erik the Outgolfer
@EriktheOutgolfer W tym kontekście odfiltrowanie oznacza odfiltrowanie.
Leaky Nun
3

Python 2 , 78 76 71 66 bajtów

-7 bajtów dzięki Mr. Xcoder.

lambda l:[x for x in l if x<sum(sum(l[:i])for i in range(len(l)))]

Wypróbuj online!

całkowicie ludzki
źródło
Myślę, że możesz to zrobić range(len(l))i l[:i+1]za -2 bajty (nie testowane)
Mr. Xcoder
Grał w golfa i zaciemniał się. ;) Dzięki!
całkowicie ludzki,
Twoje rozwiązanie jest jednak nieprawidłowe. Zmień x>sum(...)na x<sum(...), aby była ona ważna, jeszcze 76 bajtów
Mr. Xcoder
Wherps ... Naprawiono. >.>
totalnie ludzki,
3

Haskell, 39 bajtów

f l=filter(<sum(scanl1(+)l)/sum(1<$l))l

Wypróbuj online!

Niestety lengthjest typu Int, więc nie można go używać z zmiennoprzecinkowych podział /i muszę używać obejście: sum(1<$l).

nimi
źródło
3

Łuska , 10 9 bajtów

Dzięki @Zgarb za grę w golfa 1 bajtem!

f</L⁰Σ∫⁰⁰

Wypróbuj online!

Niegolfowane / Wyjaśnienie

           -- argument is ⁰ (list) 
f       ⁰  -- filter the original list with
 <         --   element strictly smaller than
     Σ∫⁰   --   sum of all prefixes
  /L⁰      --   averaged out
ბიმო
źródło
2
f</L⁰Σ∫⁰⁰ma 9 bajtów, ale trzy argumenty lambda wydają się nieporadne.
Zgarb
3

JavaScript (ES6), 56 55 52 bajtów

a=>a.filter(x=>x<t/a.length,a.map(x=>t+=s+=x,s=t=0))

Sprawdź to

o.innerText=(f=

a=>a.filter(x=>x<t/a.length,a.map(x=>t+=s+=x,s=t=0))

)(i.value=[1,4,-3,10]);oninput=_=>o.innerText=f(i.value.split`,`.map(eval))
<input id=i><pre id=o>

Kudłaty
źródło
3

Java 8, 81 bajtów

To wyrażenie lambda akceptuje a List<Float>i mutuje je. Iterator listy danych wejściowych musi obsługiwać usuwanie ( ArrayListna przykład tak). Przypisz do Consumer<List<Float>>.

a->{float l=0,t=0,u;for(float n:a)t+=n*(a.size()-l++);u=t/l;a.removeIf(n->n>=u);}

Niegolfowana lambda

a -> {
    float l = 0, t = 0, u;
    for (float n : a)
        t += n * (a.size() - l++);
    u = t / l;
    a.removeIf(n -> n >= u);
}

Wypróbuj online

Podziękowanie

  • -3 bajty dzięki Kevin Cruijssen
  • -17 bajtów dzięki Nevay
Jakob
źródło
1
Możesz zapisać 3 bajty, usuwając t/=l;i zmieniając if(n<t)na if(n<t/l).
Kevin Cruijssen
1
Możesz użyć listy zamiast tablicy, aby móc zmodyfikować podany argument zamiast drukować wartości wynikowe a->{float l=0,t=0,u;for(float n:a)t+=n*(a.size()-l++);u=t/l;a.removeIf(n->n>=u);}(81 bajtów).
Nevay
2

Python 3 , 72 bajty

lambda x:[*filter((sum(-~a*b for a,b in enumerate(x))/len(x)).__gt__,x)]

Wypróbuj online!

Halvard Hummel
źródło
Bardzo sprytne rozwiązanie! Nigdy nie myślałem, filterże wygra zwykłe rozumienie listy.
Pan Xcoder,
2

Python 3 , 76 bajtów

lambda x:[w for w in x if w<sum(u*v+v for u,v in enumerate(x[::-1]))/len(x)]

Dane wejściowe i wyjściowe są listami liczb. Wypróbuj online!

Działa to również w Pythonie 2 (z oczywistym zamiennikiem printskładni w stopce).

Luis Mendo
źródło
Czy musisz odwrócić listę?
officialaimm
@officialaimm Myślę, że tak, ponieważ wartości wyliczenia 1,2,3, ... muszą iść z x [0], x [-1], x [-2]. Ale we wszystkich przypadkach wydaje się, że wynik jest taki sam, hmm ...
Luis Mendo
1
Znalazłem kontrprzykład, który pokazuje, że cofanie jest rzeczywiście konieczne
Luis Mendo
Ach, nieważne .. Po prostu tak pomyślałem, ponieważ przeszły wszystkie testy ...: P
officialaimm
1

Pyth, 12 11 bajtów

f<T.OsM._QQ

-1 bajt dzięki Mr. Xcoder

Wypróbuj online!

Dave
źródło
11 bajtów:f<T.OsM._QQ
Pan Xcoder,
1

PHP, 84 bajty

for($i=--$argc;$i;)$s+=$i--/$argc*$r[]=$argv[++$k];foreach($r as$x)$x<$s&&print$x._;

pobiera dane wejściowe z argumentów wiersza poleceń. Uruchom -nrlub wypróbuj online .


sumowanie list częściowych jest tym samym, co sumowanie każdego elementu pomnożonego przez liczbę kolejnych elementów +1 → nie ma potrzeby żonglowania dużymi funkcjami tablicy. Jednak wciąż jest długo.

Tytus
źródło
1

J, 15 bajtów

#~[<[:(+/%#)+/\

Wypróbuj online! Oczekuje tablicy w stylu J (negatywy reprezentowane za pomocą _zamiast -i elementy oddzielone spacjami - patrz link TIO dla przykładów).

Nie wiem, czy istnieje sposób na usunięcie nawiasów wokół średniej (+/%# ), ale usunięcie tego i ograniczenie byłoby pierwszą rzeczą, którą spróbowałem zrobić, aby dalej grać w golfa.

Wyjaśnienie

Czasami J czyta jak (zaciemniony) angielski.

#~ [ < [: (+/ % #) +/\
                   +/\  Sum prefixes
                     \   Get prefixes
                   +/    Sum each
          (+/ % #)      Mean
           +/            Sum of array
              %          Divided by
                #        Length of array
   [ <                  Input array is less than?
                         (gives boolean array of pairwise comparisons)
#~                      Filter by
kapusta
źródło
1
pokonałeś mnie o 3 minuty :)
Jonah
12 bajtów z#~]<1#.+/\%#
mil
@miles Chyba że uważasz, że jest wystarczająco podobny, myślę, że twój komentarz może uzasadniać własną odpowiedź. EDYCJA: Myślę, że to bardzo sprytne.
cole
1

Mathematica, 35 bajtów

Cases[#,x_/;x<#.Range[#2,1,-1]/#2]&

Functionktóra oczekuje, że lista liczb będzie pierwszym argumentem, #a długość listy - drugim argumentem #2. #.Range[#2,1,-1]/#2pobiera iloczyn punktowy z listy wejściowej #i listy Range[#2,1,-1] == {#2,#2-1,...,1}, a następnie dzieli przez długość #2. Następnie zwracamy Cases x_listę wejściową, #która jest mniejsza niż hiper-średnia.

Bez długości jako drugiego argumentu potrzebujemy 6więcej bajtów:

Cases[#,x_/;x<#.Range[h=Tr[1^#],1,-1]/h]&
ngenisis
źródło
0

K (oK) , 26 bajtów

Rozwiązanie:

x@&x<(+/+/'x@!:'1+!#x)%#x:

Wypróbuj online!

Przykłady:

> x@&x<(+/+/'x@!:'1+!#x)%#x:1 4 -3 10
1 4 -3
> x@&x<(+/+/'x@!:'1+!#x)%#x:-289.93 912.3 -819.39 1000
-289.93 -819.39

Wyjaśnienie:

Interpretowane od prawej do lewej. Zmagał się z krótkim sposobem na wyodrębnienie prefiksów:

x@&x<(+/+/'x@!:'1+!#x)%#x: / the solution
                        x: / store input in x, x:1 4 -3 10
                       #   / count, return length of x, #1 4 -3 10 => 4
     (               )     / do everything in the brackets together
                   #x      / count x
                  !        / til, range 0..x, !4 => 0 1 2 3
                1+         / add 1 vectorised, 1+0 1 2 3 => 1 2 3 4
             !:'           / til each, e.g. !1, !2, !3, !4
           x@              / index into x at these indices (now we have the prefixes)
        +/'                / sum (+ over) each, e.g. 1 5 2 12
      +/                   / sum over, e.g. 20
                      %    / right divided by left, 20%4 => 5 (now we have the hyper average)
   x<                      / boolean list where x less than 5
  &                        / indices where true, &0111b => 1 2 3
x@                         / index into x at these indices (now we have the filtered list)

Uwagi:

Alternative version taking length of input as parameter (25 byte solution):

> {x@&x<(+/+/'x@!:'1+!y)%y}[1 4 -3 10;4]
1 4 -3
streetster
źródło
0

TI-Basic, 9 bytes

Ans*(Ans<mean(cumSum(Ans
Timtech
źródło