Giá trị xếp hạng khá


23

Bài tập

Đưa ra một danh sách đầu vào các số nguyên x 1 lệch x n , tính toán một danh sách các cấp bậc r 1 lệch r n (hoán vị của {1 tựa n} ) sao cho x r 1  x r 2  ≤ câu ≤ x r n . Sau đó, đối với mỗi x i , thay thế thứ hạng của nó bằng trung bình cộng của các cấp bậc của tất cả các giá trị trong x mà là tương đương với x i . (Tức là, bất cứ khi nào có một tie giữa các giá trị bình đẳng trong x , khá phân phối lại hàng ngũ trong số tất cả trong số họ.) Output: danh sách sửa đổi của bậc r ' 1 ... r'n .

(Đối với các chuyên viên máy tính thống kê: một bảng xếp hạng các quan sát như vậy được sử dụng trong thử nghiệm MannTHER Whitney U (phương pháp hai, bước 1.))

Thí dụ

Đưa ra một danh sách đầu vào [3, -6, 3, 3, 14, 3] , danh sách xếp hạng đầu tiên sẽ là [2, 1, 3, 4, 6, 5] , sẽ sắp xếp danh sách thành [-6, 3, 3, 3, 3, 14] . Sau đó, các cấp bậc cho cả 3 giây trong danh sách đầu vào được chia đều thành (2 + 3 + 4 + 5) 4 = 3.5 . Đầu ra cuối cùng là [3.5, 1, 3.5, 3.5, 6, 3.5] .

Các trường hợp thử nghiệm

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

Quy tắc

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.


Câu trả lời:


7

Thạch , 10 8 byte

ð_'Ṡ‘S‘H

Đã lưu 2 byte bằng cách sử dụng cmpmẹo từ câu trả lời của @ xnor .

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

ð_'Ṡ‘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

Bình 12 tháng 12

m+l<#dQ.OS/Q

Phòng thử nghiệm

Đối với mỗi giá trị, giá trị này tính trung bình số học của [1..frequency]và thêm số lượng giá trị nhỏ hơn giá trị hiện tại.

Điều này hoạt động vì với mỗi giá trị, chúng tôi sẽ tính toán:

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

mà chúng ta có thể đơn giản hóa để:

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

và một lần nữa để:

(frequency + 1) / 2 + count_less

Tuy nhiên, ở Pyth, người chơi golf đã tính toán triệu hồi đầu tiên bằng cách sử dụng hàm dựng sẵn, thay vì công thức khác này.


4

Python 2, 51 byte

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

Đối với mỗi phần tử y, cmpbiểu thức cho 2 điểm cho mỗi phần tử nhỏ hơn xvà 1 điểm cho mỗi phần tử bằng nhau x. Tổng này được định cỡ lại trong phạm vi phù hợp bằng cách thêm 1 và giảm một nửa. Điều 2.cần thiết để tránh phân chia số nguyên.

Python 3, 52 byte

Python 3 thiếu cmp, yêu cầu biểu thức Boolean (+2 byte), nhưng nó có phân chia float (-1 byte).

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

3

MATL , 14 byte

7#utG&S&S2XQw)

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm (phiên bản sửa đổi một chút của mã; mỗi kết quả nằm trên một dòng khác nhau).

      % 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 byte

Đưa đầu vào từ đầu ra STDIN thành STDOUT. Nếu đầu ra linh hoạt thì chúng ta có thể bỏ qua cat().

rank(scan())

Khá đơn giản, sử dụng thứ hạng dựng sẵn mặc định ở mức trung bình cho một bộ ngắt kết nối.

Đang sử dụng:

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

Bạn có thể thả cat(), nếu nó tùy thuộc vào tôi. Tuy nhiên, tôi không biết sự đồng thuận của cộng đồng là gì.
Lynn

@Lynn Cảm ơn tôi sẽ. Tôi luôn có thể đặt nó trở lại.
MickyT

2

J, 18 byte

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

Dựa trên giải pháp của Dennis bằng phương pháp xnor .

Sử dụng một cách tiếp cận đơn giản đòi hỏi 24 byte cho tôi.

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

Sử dụng

   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

Trên thực tế, 18 byte

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

Hãy thử trực tuyến!

Đây thực chất là một cảng của giải pháp Python của xnor .

Giải trình:

;╗`╝╜"╛-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 ký tự

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

Giả sử danh sách được lưu trữ trong X .

Giải trình:

Lưu ý rằng APL đánh giá các biểu thức từ phải sang trái. Sau đó:

  • ∘.=⍨X= X∘.=Xtrong đó ∘.=sản phẩm bên ngoài sử dụng =như chức năng dyadic. (Trường hợp bạn thường nhân lên. Vì vậy, sản phẩm bên ngoài toán học có thể được viết là∘.× .)
  • Ma trận kết quả được lưu trữ trong yyđược gấp trực tiếp bằng cách sử dụng +một vectơ số lượng các đối tượng bằng nhau cho mỗi cấp bậc (hãy gọi nó z←+/y).
  • ⍋X trả về hàng ngũ của X
  • y+.×⍋X đưa ra sản phẩm bên trong của ma trận y của chúng ta với vectơ này.
  • Kết quả được chia (thành phần khôn ngoan) bởi z.


0

JavaScript (ES6), 49 48 byte

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

Chỉnh sửa: Đã lưu 1 byte bằng cách định dạng lại biểu thức để bây giờ giống như câu trả lời Python 3 của @ xnor.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.