Saring elemen pseudo!

15

Kami mendefinisikan hiper-rata-rata dari array / daftar (angka) rata-rata aritmatika dari jumlah awalannya.

Misalnya, hiper-rata-rata daftar [1, 4, -3, 10]dihitung dengan cara berikut:

  • Kami mendapatkan awalan: [1], [1, 4], [1, 4, -3], [1, 4, -3, 10].

  • Jumlah masing-masing: [1, 5, 2, 12].

  • Dan sekarang mendapatkan mean aritmetik dari unsur-unsur dalam daftar ini: (1 + 5 + 2 + 12) / 4 = 5.

Sebuah pseudo-elemen dari sebuah array adalah elemen yang nilainya ketat lebih rendah dibandingkan hiper-rata. Karenanya, elemen pseudo dari daftar contoh kita adalah 1, 4dan -3.


Diberikan daftar angka floating-point, tugas Anda adalah mengembalikan daftar elemen semu.

  • Anda tidak perlu khawatir tentang ketidakakuratan floating-point.

  • Daftar input tidak akan pernah kosong dan mungkin berisi bilangan bulat dan float. Jika disebutkan, bilangan bulat dapat dianggap sebagai mengapung (dengan <integer>.0)

  • Anda dapat berasumsi bahwa angka-angka itu sesuai dengan bahasa pilihan Anda, tetapi tolong jangan menyalahgunakannya dengan cara apa pun.

  • Secara opsional, Anda dapat mengambil panjang array sebagai input juga.

  • Ini , jadi aturan standar untuk tag berlaku. Kode terpendek dalam byte ( dalam setiap bahasa ) menang!


Uji Kasus

Input -> Output

[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]
Tuan Xcoder
sumber
Jika beberapa bahasa diizinkan untuk mengambil panjang array sebagai input tambahan, maka itu harus diizinkan untuk semua bahasa .
ngenisis
1
@ngenisis Ini untuk semua bahasa. Jika terlalu lama mempersingkat program Anda, jangan ragu untuk melakukannya. Spesifikasi itu tidak membatasi bahasa sama sekali.
Tn. Xcoder

Jawaban:

7

MATL , 8 byte

ttYsYm<)

Cobalah online!Atau verifikasi semua kasus uji .

Penjelasan

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

05AB1E , 9 8 byte

-1 byte, terima kasih kepada Magic Octopus Urn

ηOO¹g/‹Ï

Cobalah 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 byte

Menggunakan ÅAperintah baru .

ηOÅA‹Ï

Cobalah online!

η      # Get prefixes
 O     # Sum each
  ÅA   # Get the mean
    ‹Ï #  Keep only the value that are less than the mean
Riley
sumber
2
ηOO¹g/›Ïuntuk 8; juga dimulai dengan nOO!.
Magic Octopus Mm
5

Japt v2.0a0, 12 11 10 byte

f<Uå+ x÷Ul

Menguji

  • 1 byte disimpan berkat ETH yang menunjukkan karakter yang berlebihan.

Penjelasan

Input array secara implisit U.

f<

Saring ( f) array dengan memeriksa apakah setiap elemen kurang dari ...

Uå+

Udikurangi secara kumulatif ( å) dengan menjumlahkan ...

x

Dengan array yang dihasilkan pada gilirannya dikurangi dengan menjumlahkan ...

/Ul

Dan dibagi dengan panjang ( l) dari U.

Secara implisit menampilkan array yang dihasilkan.

Shaggy
sumber
4

Python 3 dengan Numpy , 48 byte

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

Input dan output adalah array Numpy. Cobalah online!

Luis Mendo
sumber
1
+1 Akhirnya, seseorang menggunakan cumsum!
Tn. Xcoder
3

Jelly , 9 byte

+\S÷L<Ðf@

Cobalah online!

Biarawati Bocor
sumber
Mungkin <Ðf@seharusnya sebaliknya <Ðḟ@?
Erik the Outgolfer
@EriktheOutgolfer tetapi lolos semua testcases.
Leaky Nun
Masih ada sesuatu yang tampaknya tidak baik bagi saya ... pertama-tama +\S÷Lmenghitung hiper-rata-rata, kemudian <Ðf@menempatkannya sebagai argumen yang tepat dan <akan kembali 1jika suatu elemen adalah elemen pseudo, pada dasarnya memfilter untuk elemen pseudo alih-alih memfilter mereka keluar.
Erik the Outgolfer
@EriktheOutgolfer Dalam konteks ini, memfilter berarti memfilter.
Leaky Nun
3

Python 2 , 78 76 71 66 byte

-7 byte terima kasih kepada Tn. Xcoder.

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

Cobalah online!

benar-benar manusiawi
sumber
Saya pikir Anda dapat melakukan range(len(l))dan l[:i+1]untuk -2 byte (tidak diuji)
Tn. Xcoder
Golf dan dikaburkan. ;) Terima kasih!
totallyhuman
Solusi Anda tidak valid. Ubah x>sum(...)agar x<sum(...)valid, masih 76 byte
Mr. Xcoder
Wherps ... Diperbaiki. >.>
totallyhuman
3

Haskell, 39 byte

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

Cobalah online!

Sayangnya lengthadalah tipe Int, jadi saya tidak bisa menggunakannya dengan pembagian floating titik /dan saya harus menggunakan solusi: sum(1<$l).

nimi
sumber
3

Husk, 10 9 bytes

Thanks @Zgarb for golfing off 1 byte!

f</L⁰Σ∫⁰⁰

Try it online!

Ungolfed/Explanation

           -- argument is ⁰ (list) 
f       ⁰  -- filter the original list with
 <         --   element strictly smaller than
     Σ∫⁰   --   sum of all prefixes
  /L⁰      --   averaged out
ბიმო
sumber
2
f</L⁰Σ∫⁰⁰ is 9 bytes, but three lambda arguments feels clunky.
Zgarb
3

JavaScript (ES6), 56 55 52 bytes

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

Test it

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>

Shaggy
sumber
3

Java 8, 81 bytes

This lambda expression accepts a List<Float> and mutates it. The input list's iterator must support removal (ArrayList's does, for example). Assign to 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);}

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

Try It Online

Acknowledgments

  • -3 bytes thanks to Kevin Cruijssen
  • -17 bytes thanks to Nevay
Jakob
sumber
1
You can save 3 bytes by removing t/=l; and change if(n<t) to if(n<t/l).
Kevin Cruijssen
1
You can use a list instead of an array to be able to modify the provided argument rather than printing the resulting values 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 bytes).
Nevay
2

C# (Mono), 95 bytes

using System.Linq;a=>a.Where(d=>d<new int[a.Length].Select((_,i)=>a.Take(i+1).Sum()).Average())

Try it online!

TheLethalCoder
sumber
2

Python 3, 72 bytes

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

Try it online!

Halvard Hummel
sumber
Very clever solution! I never thought filter would win over the usual list comprehension.
Mr. Xcoder
2

Python 3, 76 bytes

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

Input and output are lists of numbers. Try it online!

This works in Python 2 too (with the obvious replacement for print syntax in the footer).

Luis Mendo
sumber
Do you need to reverse the list?
officialaimm
@officialaimm I think so, because enumeration values 1,2,3,... must go with x[0], x[-1], x[-2]. But in all cases the result seems to be the same, hmm...
Luis Mendo
1
I found a counterexample which shows that reversing is indeed necessary
Luis Mendo
Ah, never mind.. I just thought so because it passed all the test cases... :P
officialaimm
2

Perl 6, 31 bytes

{.grep(flat([\,] $_).sum/$_>*)}

Try it online!

Sean
sumber
1

Pyth, 12 11 bytes

f<T.OsM._QQ

-1 byte thanks to Mr. Xcoder

Try it online!

Dave
sumber
11 bytes: f<T.OsM._QQ
Mr. Xcoder
1

PHP, 84 bytes

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

takes input from command line arguments. Run with -nr or try it online.


summing up the partial lists is the same as summing up each element multiplied with the number of following elements +1 → no need to juggle with bulky array functions. It´s still long, though.

Titus
sumber
1

J, 15 bytes

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

Try it online! Expects a J-style array (negatives represented using _ instead of - and elements separated by spaces -- see the TIO link for examples).

I don't know if there's a way to remove the parentheses around the mean (+/%#) but removing that and the cap would be the first thing I'd try to do to golf this further.

Explanation

Sometimes J reads like (obfuscated) English.

#~ [ < [: (+/ % #) +/\
                   +/\  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
cole
sumber
1
you beat me to it by 3 mins :)
Jonah
12 bytes with #~]<1#.+/\%#
miles
@miles Unless you think it's similar enough, I think your comment might warrant its own answer. EDIT: I think it's very clever myself.
cole
1

Mathematica, 35 bytes

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

Function which expects a list of numbers as the first argument # and the length of the list as the second argument #2. #.Range[#2,1,-1]/#2 takes the dot product of the input list # and the the list Range[#2,1,-1] == {#2,#2-1,...,1}, then divides by the length #2. Then we return the Cases x_ in the input list # which are less than the hyper-average.

Without the length as a second argument, we need 6 more bytes:

Cases[#,x_/;x<#.Range[h=Tr[1^#],1,-1]/h]&
ngenisis
sumber
0

K (oK), 26 bytes

Solution:

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

Try it online!

Examples:

> 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

Explanation:

Interpretted right-to-left. Struggled with a short way to extract prefixes:

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)

Notes:

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
sumber
0

TI-Basic, 9 bytes

Ans*(Ans<mean(cumSum(Ans
Timtech
sumber