จัดอันดับค่าอย่างเป็นธรรม


23

งาน

รับรายการการป้อนข้อมูลของจำนวนเต็มx 1 ... x nคำนวณรายการอันดับr 1 ... R n (กการเปลี่ยนแปลงของ{1} ... n ) เพื่อที่x R 1  ≤ x R 2  ≤≤ x ... R n แล้วสำหรับแต่ละx ฉันเปลี่ยนตำแหน่งของตนโดยมีค่าเฉลี่ยเลขคณิตของการจัดอันดับของค่าทั้งหมดในxที่เท่ากับxฉัน (นั่นคือเมื่อใดก็ตามที่มีการเสมอกันระหว่างค่าที่เท่ากันในxให้แบ่งอันดับใหม่อย่างเป็นธรรมในหมู่พวกเขาทั้งหมด) เอาท์พุทรายการแก้ไขของอันดับr ' 1 … r'n .

(สำหรับสถิติ geeks: การจัดอันดับของการสังเกตดังกล่าวถูกนำมาใช้ในMann-Whitney Uทดสอบ (วิธีสองขั้นตอนที่ 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

ที่บันทึกไว้ 2 ไบต์โดยใช้cmpเคล็ดลับจาก@ XNOR ของคำตอบ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

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

อย่างไรก็ตามในพี ธ มันเป็นนักกอล์ฟที่จะคำนวณการสรุปครั้งแรกโดยใช้ค่าเฉลี่ย builtin แทนที่จะเป็นสูตรอื่น


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@:+*@-/~

อิงตามวิธีแก้ปัญหาของ Dennis โดยใช้วิธีของ 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

จริงแล้ว 18 ไบต์

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

ลองออนไลน์!

นี้เป็นหลักพอร์ตของการแก้ปัญหาของงูหลาม XNOR

คำอธิบาย:

;╗`╝╜"╛-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ที่∘.=เป็นผลิตภัณฑ์ด้านนอกใช้=เป็นฟังก์ชัน dyadic (โดยปกติแล้วคุณจะทวีคูณดังนั้นผลิตภัณฑ์ด้านนอกเชิงคณิตศาสตร์อาจถูกเขียนเป็น∘.×)
  • เมทริกซ์ที่ได้จะถูกเก็บไว้ในyและyถูกพับเก็บโดยตรงโดยใช้+เพื่อให้เวกเตอร์ของจำนวนวัตถุที่เท่ากันสำหรับแต่ละอันดับ (ให้เรียกมันว่า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 ไบต์โดยปรับโครงสร้างนิพจน์ดังนั้นตอนนี้ดูเหมือนว่าคำตอบ Python 3 ของ @ xnor

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.