擬似要素を除外します!


15

配列/リスト(数値)のハイパー平均を、そのプレフィックスの合計の算術平均と定義します。

たとえば、リストのハイパー平均は[1, 4, -3, 10]次の方法で計算されます。

  • プレフィックスを取得します[1], [1, 4], [1, 4, -3], [1, 4, -3, 10]

  • 各合計:[1, 5, 2, 12]

  • そして、次のリストの要素の算術平均を取得します(1 + 5 + 2 + 12) / 4 = 5

擬似要素アレイのは、値がある元素であり、厳密にそのハイパー平均よりも低いです。したがって、サンプルのリストの擬似要素は14および-3です。


浮動小数点数のリストが与えられたら、あなたの仕事は、擬似要素のリストを返すことです。

  • 浮動小数点の不正確さを心配する必要はありません。

  • 入力リストは空になることはなく、整数と浮動小数点の両方を含むことができます。言及した場合、整数は(とフロートとみなすことができます<integer>.0

  • 数字は選択した言語に合っていると思われるかもしれませんが、決してそれを乱用しないでください。

  • オプションで、配列の長さも入力として使用できます。

  • これはなので、タグの標準ルールが適用されます。バイト単位の最短コード(各言語)が勝ちます!


テストケース

入力->出力

[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]

一部の言語で追加の入力として配列の長さを使用できる場合、すべての言語で許可される必要があります
-ngenisis

1
@ngenisisこれはすべての言語用です。長さを長くするとプログラムが短くなる場合は、お気軽にそれを行ってください。その仕様は、言語を制限するものではありません。
ミスターXcoder

回答:



7

05AB1E9 8バイト

Magic Octopus Urnのおかげで-1バイト

ηOO¹g/‹Ï

オンラインでお試しください!

η        # 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バイト

新しいÅAコマンドを使用します。

ηOÅA‹Ï

オンラインでお試しください!

η      # Get prefixes
 O     # Sum each
  ÅA   # Get the mean
    ‹Ï #  Keep only the value that are less than the mean

2
ηOO¹g/›Ï8のために; また、で始まりnOO!ます。
魔法のタコUr

5

JAPT v2.0a0、12の 11 10バイト

f<Uå+ x÷Ul

試して

  • ETHが冗長文字を指し示しているため、1バイトが節約されました。

説明

arrayの暗黙的な入力U

f<

f各要素が...よりも小さいかどうかをチェックして、配列をフィルタリングします(...)

Uå+

Uå加算により累積的に減少()...

x

結果の配列は、合計することによって順番に削減されて...

/Ul

そしての長さ(l)で割ったU

結果の配列を暗黙的に出力します。



3

たぶん<Ðf@代わりにする必要がありますか<Ðḟ@
エリックアウトゴルファー

@EriktheOutgolferしかし、それはすべてのテストケースに合格します。
リーキー修道女

それでも何かが良くないように思えます...最初に+\S÷Lハイパー平均を計算し、次にそれ<Ðf@を正しい引数として入れ、要素が擬似要素である場合<に戻り1ます、本質的にフィルタリングの代わりに擬似要素をフィルタリングしますそれらを。
エリックアウトゴルファー

@EriktheOutgolferこのコンテキストでは、フィルター処理はフィルター処理を意味します。
リーキー修道女

3

パイソン278の 76 71 66バイト

Xcoder氏のおかげで-7バイト。

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

オンラインでお試しください!


私はあなたが行うことができると思うrange(len(l))l[:i+1]のために-2バイト(テストしていません)
ミスターXcoder

ゴルフと難読化。;)ありがとう!
完全に人間

ただし、ソリューションは無効です。有効にするには、まだ76バイトに変更x>sum(...)ますx<sum(...)
Xcoder氏

Wherps ...修正済み。>。>
完全に人間



3

10 9バイト

@ Zgarb、1バイトのゴルフをありがとう!

f</L⁰Σ∫⁰⁰

オンラインでお試しください!

非ゴルフ/説明

           -- argument is ⁰ (list) 
f       ⁰  -- filter the original list with
 <         --   element strictly smaller than
     Σ∫⁰   --   sum of all prefixes
  /L⁰      --   averaged out

2
f</L⁰Σ∫⁰⁰は9バイトですが、3つのラムダ引数は不格好です。
-Zgarb

3

JavaScript(ES6)、56 55 52バイト

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

試して

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>


3

Java 8、81バイト

このラムダ式はa List<Float>を受け入れ、それを変更します。入力リストのイテレータは削除をサポートする必要があります(ArrayListたとえば、がサポートします)。に割り当て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);}

ゴルフされていないラムダ

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

オンラインで試す

謝辞

  • Kevin Cruijssenのおかげで-3バイト
  • ネバイのおかげで-17バイト

1
あなたは除去することにより、3つのバイトを保存することができますt/=l;し、変更if(n<t)しますif(n<t/l)
ケビンCruijssen

1
配列の代わりにリストを使用して、結果の値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バイト)を出力するのではなく、提供された引数を変更できます。
ネベイ



2

Python 3、76バイト

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

入力と出力は数字のリストです。オンラインでお試しください!

これはPython 2でも機能します(printフッターの構文が明らかに置き換えられています)。


リストを逆にする必要がありますか?
officialaimm

@officialaimm列挙値1,2,3、...はx [0]、x [-1]、x [-2]で指定する必要があるため、そう思います。しかし、すべてのケースで、結果は...うーん、同じのようです
ルイスMendo

1
逆転が実際に必要であることを示す反例が見つかりました
ルイスメンドー

ああ、気にしないで..すべてのテストケースに合格したのでそう思っただけです。:P
officialaimm





1

PHP、84バイト

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

コマンドライン引数から入力を受け取ります。で実行する-nr、オンラインで試してください


部分リストの合計は、各要素の合計に後続の要素の数+1を加算したものと同じです→かさばる配列関数を操作する必要はありません。それでもまだ長いです。



1

J、15バイト

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

オンラインでお試しください!Jスタイルの配列を想定しています(スペースで区切られた要素の_代わりに-を使用して表されるネガティブ。例についてはTIOリンクを参照してください)。

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

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これは、最初の引数として数値#のリストを、2番目の引数としてリストの長さを期待します#2#.Range[#2,1,-1]/#2入力リスト#とリストの内積を取り、Range[#2,1,-1] == {#2,#2-1,...,1}長さで割る#2。次にCases x_、入力リストに# which are less than the hyper-average.

2番目の引数として長さがない場合、6さらにバイトが必要です。

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

0

K(oK)、26バイト

解決:

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

オンラインでお試しください!

例:

> 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

説明:

右から左に解釈されます。プレフィックスを抽出する短い方法に苦労しました:

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)

ノート:

入力の長さをパラメーターとして取る代替バージョン(25バイトソリューション):

> {x@&x<(+/+/'x@!:'1+!y)%y}[1 4 -3 10;4]
1 4 -3

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.