値をかなりランク付けする


23

仕事

整数の入力リスト所与X 1 ... X nは、ランクのリストを計算rは1つの ... R N(の順列{1 ... N} )ように、X 、R 1  ≤X 、R 2  ≤...≤X R nは。次に、各x iについて、そのランクをx iに等しいxのすべての値のランクの算術平均で置き換えます。(つまり、xの値が等しい場合は、ランクをすべてのランクに均等に再配分します。)ランクr ' 1 …r'の修正リストを出力します。n個

(統計オタクの場合:観測のそのようなランキングは、Mann–Whitney U検定で使用されます(方法2、ステップ1))

入力リスト[3、-6、3、3、14、3]を指定すると、ランクの最初のリストは[2、1、3、4、6、5 ]になり、リストを[-6、 3、3、3、3、14]。次に、入力リストの3つすべてのランクが(2 + 3 + 4 + 5)÷4 = 3.5に均等化されます。最終的な出力は[3.5、1、3.5、3.5、6、3.5]です。

テストケース

[4, 1, 4] -> [2.5, 1.0, 2.5]
[5, 14, 14, 14, 14, 5, 14] -> [1.5, 5.0, 5.0, 5.0, 5.0, 1.5, 5.0]
[9, 9, -5, -5, 13, -5, 13, 9, 9, 13] -> [5.5, 5.5, 2.0, 2.0, 9.0, 2.0, 9.0, 5.5, 5.5, 9.0]
[13, 16, 2, -5, -5, -5, 13, 16, -5, -5] -> [7.5, 9.5, 6.0, 3.0, 3.0, 3.0, 7.5, 9.5, 3.0, 3.0]

ルール

これはであるため、バイト単位の最短コードが優先されます。


回答:


7

ゼリー10 8 バイト

ð_'Ṡ‘S‘H

@ xnor's answerのcmpトリックを使用して2バイトを節約しました。

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

ð_'Ṡ‘S‘H  Main link. Left argument: A (list of values)

ð         Make the chain dyadic, setting the right argument to A.
 _'       Spawned subtraction; compute the matrix of differences.
   Ṡ      Apply the sign function to each difference.
    ‘     Increment.
     S    Sum across columns.
      ‘   Increment.
       H  Halve.

6

Pyth、12

m+l<#dQ.OS/Q

テストスイート

各値に対して、これは算術平均を計算し[1..frequency]、現在の値よりも少ない値のカウントを加算します。

これは、各値に対して次の計算を行うために機能します。

(1 / frequency) * sum (i = 1..frequency) i + count_less

次のように単純化できます。

(1 / frequency) * [ frequency * (frequency + 1) / 2 + count_less * frequency ]

そして再び:

(frequency + 1) / 2 + count_less

ただし、Pythでは、この他の式ではなく、平均ビルトインを使用して最初の被加数を計算する方がゴルファーでした。


4

Python 2、51バイト

lambda l:[-~sum(1+cmp(y,x)for x in l)/2.for y in l]

各要素yに対して、cmp式は小さい方ごとに2点を与えますx等しいごとに1ポイントをxます。この合計は、1を追加して半分にすることにより、適切な範囲に再スケーリングされます。2.整数の除算を避けるために必要とされます。

Python 3、52バイト

Python 3にはがなくcmp、ブール式(+2バイト)が必要ですが、浮動小数点除算(-1バイト)があります。

lambda l:[-~sum((y>x)+(y>=x)for x in l)/2for y in l]

3

MATL、14バイト

7#utG&S&S2XQw)

オンラインでお試しください!または、すべてのテストケースを確認します(コードのわずかに変更されたバージョン。各結果は異なる行にあります)。

      % Implicit input. Example: [5 14 14 14 14 5 14]
7#u   % Replace each value by a unique, integer label. Example: [1; 2; 2; 2; 2; 1; 2]
t     % Duplicate
G&S   % Push input again. Sort and get indices of the sorting. Example: [1 6 2 3 4 5 7]
&S    % Sort and get the indices, again. This gives the ranks. Example: [1 3 4 5 6 2 7]
2XQ   % Compute mean of ranks for equal values of the integer label. Example: [1.5; 5]
w     % Swap top two elements in stack
)     % Index the means with the integer labels. Example: [1.5; 5; 5; 5; 5; 1.5; 5]
      % Implicit display


3

R、 17 12バイト

STDIN出力からSTDOUTへの入力を取得します。出力が柔軟な場合、を捨てることができcat()ます。

rank(scan())

かなり単純な、組み込みのランクを使用して、デフォルトでタイブレーカーの平均に設定します。

使用中で:

> rank(scan())
1: 5 14 14 14 14 5 14
8: 
Read 7 items
[1] 1.5 5.0 5.0 5.0 5.0 1.5 5.0
> rank(scan())
1: 3 -6 3 3 14 3
7: 
Read 6 items
[1] 3.5 1.0 3.5 3.5 6.0 3.5
> 

cat()それは私次第なら、あなたは落とすかもしれません。しかし、コミュニティのコンセンサスが何であるかはわかりません。
リン

@Lynnありがとう。いつでも元に戻すことができます。
MickyT

2

J、18バイト

1-:@+1+/"1@:+*@-/~

xnorの方法を使用したデニスのソリューションに基づくます。

簡単なアプローチを使用するには、24バイトが必要です。

(i.~~.){](+/%#)/.1+/:@/:

使用法

   f =: 1-:@+1+/"1@:+*@-/~
   f 3 _6 3 3 14 3
3.5 1 3.5 3.5 6 3.5
   f 4 1 4
2.5 1 2.5
   f 5 14 14 14 14 5 14
1.5 5 5 5 5 1.5 5
   f 9 9 _5 _5 13 _5 13 9 9 13
5.5 5.5 2 2 9 2 9 5.5 5.5 9
   f 13 16 2 _5 _5 _5 13 16 _5 _5
7.5 9.5 6 3 3 3 7.5 9.5 3 3


1

APL、17文字

(y+.×⍋X)÷+/y←∘.=⍨X

リストがに保存されてXいると仮定します。

説明:

APLは式を右から左に評価することに注意してください。次に:

  • ∘.=⍨X= X∘.=Xここで∘.=使用外積である=ダイアディック関数として。(通常は乗算します。したがって、数学的な外積はとして記述できます∘.×。)
  • 結果の行列はに保存されyyを使用+して直接畳まれて、各ランクに等しいオブジェクトの数のベクトルが与えられます(呼び出しますz←+/y)。
  • ⍋X のランクを返します X
  • y+.×⍋X このベクトルと行列yの内積を返します。
  • 結果は(コンポーネント単位)で除算されzます。


0

JavaScript(ES6)、49 48バイト

a=>a.map(n=>a.reduce((r,m)=>r+(n>m)+(n>=m),1)/2)

編集:式を再構成して1バイトを保存し、@ xnorのPython 3の回答のようになりました。

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