合理排名值


23

任务

给定整数的输入列表中X 1 ... X Ñ,计算行列的列表- [R 1个 ...ř Ñ(的置换{1 ... N} ),使得X - [R 1  ≤X - [R 2  ≤...≤X - [R Ñ。然后,对于每个x i,用x中等于x i的所有值的秩的算术平均值替换其秩。(即,每当有相等的值之间的粘结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 s 的等级被平均为(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]

规则

这是,因此以字节为单位的最短代码获胜。


Answers:


7

果冻10 8 字节

ð_'Ṡ‘S‘H

使用@xnor的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

珀斯,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()如果由我决定,您可以删除。不过,我不知道社群的共识是什么。
林恩

@琳恩谢谢,我会的。我总是可以放回去。
MickyT

2

J,18个字节

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

基于使用xnor 方法的 Dennis 解决方案

使用简单的方法对我来说需要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

其实是18个位元组

;╗`╝╜"╛-su"£MΣu½`M

在线尝试!

这实质上是xnor的Python解决方案的一部分

说明:

;╗`╝╜"╛-su"£MΣu½`M
;╗                  push a copy of input to reg0
  `             `M  for x in input:
   ╝                  push x to reg1
    ╜                 push input from reg0
     "    "£M         for y in input:
      ╛                 push x from reg0
       -s               cmp(y,x) (sgn(y-x))
         u              add 1
             Σu½      sum, add 1, half

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答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.