四分位平均


26

仕事

ソートされた浮動小数点データセットを(何らかの方法で)与えられた場合、(何らかの方法で、正しい値の1‰以内で)四分位平均を返します。

1つの可能なアルゴリズム

  1. データポイントの最低および最高の四半期を破棄します。
  2. 残りのデータポイントの平均(合計をカウントで割った値)を計算します。

注:データセットのサイズが4つに均等に分割できない場合、サブセットで共有されるデータポイント比較検討する必要があります。下記の評価例2を参照してください。

評価例1

与えられた{1、3、4、5、6、6、7、7、8、8、8、9、38}

  1. 我々は最低と最高3のデータポイントを削除するように、データ数は、12である:
    { 1、3、4、 5、6、6、7、7、8、8、9、38 }
  2. 残りの6つのデータポイントの平均:
    (5 + 6 + 6 + 7 + 7 + 8)/ 6 = 6.5

評価例2

与えられた{1、3、5、7、9、11、13、15、17}

  1. カウントは9なので、各四半期には2¼データポイントがあります:
    { 1、2、(0.25×5)、(0.75×5)、7、9、11 、(0.75×13)、(0.25×13)、 15、17 }
  2. 残りの4.5データポイントの平均:
    (0.75×5 + 7 + 9 + 11 + 0.75×13)/ 4.5 = 9

回答:



8

Pyth11 10バイト

.O> <lQS * 4Ql
.OsPtc4S * 4

テストスイート。

使い方

入力リストを4倍にして、データ数が4で割り切れるようにします。

*4個々の要素ごとではなくリスト全体に適用されるため、ソートが必要です。

次に、リストを4つの等しい部分に分割し、最初と最後の部分を取り除きます。

残りのリストはフラット化され、平均が取られます。


8

MATL12 11バイト

4Y"G"6L)]Ym

入力は次の形式の水平ベクトルです

[1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38]

または

[1 3 4 5 6 6 7 7 8 8 9 38]

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

説明

4Y"    % Input horizontal vector implicitly. Repeat each element 4 times (run-length
       % decoding). The resulting array is still sorted.
G"     % Push input, for each: repeat as many times as the input size
  6L)  %   Remove first and last elements, by applying the index "2:end-1"
]      % End for each
Ym     % Compute mean. Display implicitly

わかりません。6L)最初と最後の要素をどのように削除しますか?私がそれをするとき、それは多くの複素数をプッシュします。
DJMcMayhem

5
@DrGreenEg​​gsandIronMan複素数は、MATLで使用できます。虚数単位は配列の終わりを表し、3つの数字のうち2つが範囲を定義します。その[2, -1+i]ため、インデックスとして使用する場合は2:end-1
ルイスメンドー

7

雪だるま、66バイト

}vg","aS:10sB;aM4aRAsOal`,4nD,`aG0AaGal`NdE`AaL1AfL:nA;alaF,nDtSsP

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

@LeakyNunの回答と同じアルゴリズムを使用します。

}         enable variables b, e, and g
vg        read a line of input into b
","aS     split on commas (in-place)
:10sB;aM  convert each element in resulting array to number ("frombase(10)-map")
4aR       repeat the array 4 times
AsO       sort the array
al        take the length and put it in e without consuming b (the array)
`,        swap b and e, then move e to g; now b=length g=array
4nD       divide b by 4 (4 was stored in e, which is why the array was moved)
,`        move the array and length/4 back to their original positions
aG        split the array into groups of length (length/4)
0AaG      take all elements with index >0 (i.e. remove the first element)
al        store the length of the new array in e again
`NdE`     bring it up to b, decrement, and put it back
AaL       take all elements with index <length-1 (i.e. remove last)
1AfL      flatten the array 1 level deep
:nA;      push a block that adds two numbers (to e)
al        store the length of this new array in g
aF        fold b over e (sum the numbers)
,         move g (the length) into e
nD        divide the sum by the length, resulting in the average
tSsP      to-string and print

2
この言語はひどいようです。大好きです。
メゴ


5

ゼリー14 13 12 バイト

x4ṫL '$ḣLN$ S÷ 
LHx4ṫLḊḣLN$ S÷LH
x4œs4ḊṖFS÷LH

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

テストスイート。

使い方

それはPythでの私の答えの翻訳です。


APLで15にできるので、これは短縮できると確信しています。
アダム

@アダム(私は母にコピーできるように)あなたのソリューションを投稿してください
漏れ修道女

マリヌスにチャンスを与えたい...
アダム


確かに9か月以上後の十分なチャンス
ルイスメンドー


4

Brachylog、21バイト

:3jo@4brbcLl/N,L+:N*.

オンラインでお試しください!または複数のテストケースを検証する

説明

これは基本的に@LeakyNunのPyth応答アルゴリズムです。

:3j      Append 3 copies of the input to itself
o@4      Sort and split in 4 lists of equal length
brb      Remove the head and the tail of the list of lists
cL       Concatenate the 2 sublists into a list L
l/N,     N is the inverse of the length of L
L+:N*.   Output is the product of N and the sum of the elements of L

2つの整数間の除算は整数除算であるため、長さで割るのではなく、長さの逆数で乗算するのが唯一の小さなトリックです。


3

オクターブ、44バイト

@(x)mean(reshape(~~(1:4)'*x,[],4)(:,2:3)(:))

これは、匿名関数を定義します。

入力は水平ベクトルです。

ideoneで試してみてください

説明

入力水平ベクトルは、最初*に4つの列ベクトル(で構築された)で行列乗算()されます~~(1:4)'。結果は、各行が入力ベクトルのコピーである4列の行列です。これは、要素の線形順序を維持しながら、4列のマトリックス(reshape(...,[],4))に再形成されます。中央の2つの列は保持され((:,2:3))、1つの列に線形化され((:))、その平均が計算されます(mean(...))。


[x;x;x;x]代わりに、より読みやすい1バイトを保存できます~~(1:4)'*x
トムカーペンター

@(x)mean([x;x;x;x](:)((b=numel(x))+1:3*b))また、2バイト少なくなります。それが私が思いついた理由でしたが、それは基本的にあなたのアプローチと同じです。
トムカーペンター

@TomCarpenterそんなに似ているとは思わない。別の回答として投稿する必要があると思う
ルイスメンドー

3

J20 18バイト

@milesのおかげで2バイト

#-:@%〜-@#+ / @}。#}。4#]
-@#(+ /%#)@}。#}。4#]

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

使用法

>> f =: -@#(+/%#)@}.#}.4#]
>> f 1 3 5 7 9 11 13 15 17
<< 9

使い方

それはPythでの私の答えの翻訳です。



@Adámありがとう、追加しました。
リーキー修道女

2
あなただけの直接中央部の平均を取ることができます-@#(+/%#)@}.#}.4#]のために18バイト
マイル


2

オクターブ、42バイト

Octaveの別の匿名関数。

@(x)mean([x;x;x;x](:)((b=numel(x))+1:3*b))

オンラインで試すことができます。単にそのコマンドを入力してから、ans([1 2 4 5 6 9])必要な番号を入力してください。

これは、最初に4つのコピーを垂直に連結し、次にそれを垂直に平坦化することにより、各入力要素が4つある入力配列から作成します。これにより、ソート順が維持されます。

次に、入力配列の長さから、入力配列の長さの1から3倍までの要素の範囲を抽出します。新しい配列は4倍長いため、これにより上下の四分位が切り取られます。

最後に、新しい配列の平均が返されます。


2

05AB1E、15バイト

€D€D¹gô¦¨˜DOsg/

説明

€D€D             # quadruple each element in list
    ¹gô          # split into pieces the size of input
       ¦¨˜       # remove the first and last and flatten the middle 2
          DOsg/  # sum and divide by length

オンラインで試す


2

APL(Dyalog)、15バイト

IQM←(+/÷≢)≢↓-∘≢↓4∘/

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

4∘/ 各要素を四重に

-∘≢↓ 引数にある要素と同数の後続要素を削除します

≢↓ 引数にある要素と同じ数の先行要素を削除します

() 次の暗黙関数を適用します。

+/ 合計

÷ で割った

 集計


1

JavaScript(ES6)、75バイト

a=>a.concat(a,a,a).sort(g=(x,y)=>x-y).slice(l=a.length,-l).reduce(g,0)/l/-2

明白な4重化とソートのアプローチを使用しますreduce。ここでの唯一の策略は、ソートコンパレータを再利用してすべての配列要素をゼロから減算することで4バイトを節約する-2lことです。



1

実際には、12バイト

4α;l¼≈;±(Htæ

オンラインでお試しください!(TIOは数バージョン遅れているため、現在は機能しません)

説明:

4α;l¼≈;±(Htæ
4α            repeat each element 4 times
  ;l¼≈        length divided by 4, as integer
      ;±      copy, unary negate
        (Ht   remove first and last quartiles
           æ  mean

1

Mathematica、51バイト

Mean@#[[(l=1+Length@#/4);;-l]]&@Sort@Join[#,#,#,#]&

リストの4つのコピーをソートし(リストの長さが4の倍数ではないという問題を防ぐため)、に参加"1 quarter the length of resulting list plus 1"し、"1/4 length list + 1 from the end"を取得しMeanます。


1

ジャワ146の 126バイト

このようなjavaは非常に冗長です!

float m(float[]n){float r=0;int l=n.length,i=l/4;r-=(n[i])*(l%4)/4;r+=n[i*3]*(4-(l%4))/4;for(;i<l*3/4;r+=n[i],i++);return r/l*2;}

古いUngolfedはテストケースで部分的に読み取り可能

/**
 *
 * @author rohan
 */
public Golf{

float m(float[]n){
//declarations 
float r=0;
int x,i=0,l=n.length;
//sum the array 
for(float m:n){r+=m;}
//remove the excess
for(;i<l/4;r-=n[i]+n[l-i-1],i++);
//weight the quartiles
r-=(n[l/4]+n[l*3/4])*(l%4)/4;
//return the sum/length but multiply by two since only half of the set is averaged
return r/l*2;
    }
static void interQuartileMean(float... set){
    System.out.println(new Golf().m(set));
}
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
    //test cases pass with flying colours
        interQuartileMean(1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38);
        interQuartileMean(1, 3, 5, 7, 9, 11, 13, 15, 17);   
    }

}

1

Clojure、82 81バイト

編集:「didvide by 2 n」の部分を書き直して1バイト少なくします。

#(let[n(count %)](*(/ n)0.5(apply +(subvec(vec(for[i % j(range 4)]i))n(* 3 n)))))

前:

#(let[n(count %)](/(apply +(subvec(vec(for[i % j(range 4)]i))n(* 3 n)))(* 2.0 n)))

小数の結果を持たないようにfor浮動小数点数を使用して、4つの繰り返し値を生成するために使用します2.0。残りは単なる標準です。


1

R、17 11バイト

mean(n,0.25)

仮定nは、標準R形式の入力ベクトルn=c(1, 2, 3, ...)です。

Rは「統計計算の言語」と見なすことができ、多くの統計ビルトインを備えているため、これは決して驚くことではありません。

更新。trimデフォルトで最初のオプション引数であるため、rturnbullのおかげで6バイト節約されました!

テストケース:

a <- c(1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38)
b <- c(1, 3, 5, 7, 9, 11, 13, 15, 17)
mean(a,trim=0.25) # Returns 6.5
mean(b,trim=0.25) # Returns 9

以来trim、デフォルトの第二引数である、あなたはそれに名前を付ける必要はありません。または0.25に短縮できます。これにより、6バイト節約できます。.251/4
rturnbull 16

0

Excel、17バイト

=TRIMMEAN(A:A,.5)

リラックスした入力形式により、これが簡単になります。列Aに行ごとに1つずつ入力します。

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