공정한 순위 가치


23

태스크

정수 x 1 … x n 의 입력 목록이 주어지면 x r 1  ≤ x r 2  ≤… ≤ x r n이 되도록 순위 r 1 … r n (순열 {1… n} ) 의 목록을 계산하십시오 . 그리고, 각 X , 모든 값의 순위의 산술 평균하여 순위를 교체 X 동등한 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 answercmp트릭을 사용하여 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

파이썬 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.정수 나누기를 방지하기 위해 필요하다.

파이썬 3, 52 바이트

Python 3에는 cmp부울 식 (+2 바이트)이 필요하지만 float 나누기 (-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

@Lynn 감사합니다. 나는 항상 그것을 다시 넣을 수 있습니다.
MickyT 2016 년

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어디에 있습니까 ? (일반적으로 곱할 위치입니다. 따라서 수학적 외부 곱은로 표기 될 수 있습니다 .)∘.==∘.×
  • 얻어진 행렬에 저장 y하고 y직접 사용 접혀진 +각 랭크 동일한 개체 수의 벡터를 제공하는 (호출 수 z←+/y).
  • ⍋X 의 순위를 반환 X
  • y+.×⍋X 이 벡터로 행렬 y의 내부 곱을 제공합니다.
  • 결과는 (구성 요소 별)로 나뉩니다 z.


0

자바 스크립트 (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.