Xếp hạng danh sách điểm số với bỏ qua


8

Đưa ra một danh sách điểm số (số nguyên không âm) được sắp xếp trước từ lớn nhất đến nhỏ nhất:

[ 10, 10, 6,  6,  4,  0]

Chỉ định mỗi điểm một thứ hạng nguyên, bắt đầu bằng 1 và tăng dần, sao cho điểm bằng nhau có cùng thứ hạng (nghĩa là chúng được gắn):

[ 1, 1, 3, 3, 5, 6 ]

Trong trường hợp quan hệ, các cấp bậc được "bỏ qua", ví dụ: do điểm số lớn nhất thứ nhất và thứ hai (10 và 10) bị ràng buộc, cả hai đều có thứ hạng 1 và thứ hạng 2 là "bị bỏ qua", do đó, điểm số cao thứ ba ( 6) có hạng 3.

Xuất ra một danh sách các thứ hạng không giảm tương ứng với điểm số đầu vào.

Ví dụ

In:  10 10  6  6  4  0
Out:  1  1  3  3  5  6
In:  10  9  8
Out:  1  2  3
In:   0  0  0
Out:  1  1  1
In:  16 15 15 12 11 11 10  9  9  9  8  2  2  2  0
Out:  1  2  2  4  5  5  7  8  8  8 11 12 12 12 15

Đầu vào

Giả sử tất cả các điểm sẽ nằm trong khoảng từ 0 đến 1.000, và đầu vào sẽ có không quá 500 điểm. Đầu vào có thể ở bất kỳ định dạng nào thuận tiện cho ngôn ngữ bạn chọn (bao gồm nhưng không giới hạn ở STDIN, đối số cho một hàm, một mảng đã được lưu trữ trong một biến, v.v.).

Đầu ra

Return hoặc lưu trữ trong một biến kết quả ra lệnh danh sách các cấp bậc, hoặc ghi nó vào STDOUT một cách con người có thể đọc được (ví dụ như 1 2 3, [1,2,3], 1\n2\n3\n, và { 1, 2, 3 }tất cả đều tốt; 123không phải là, vì thiếu một dấu phân cách). Điểm số đầu vào có thể được lưu trữ / in cùng với thứ hạng đầu ra tương ứng của chúng, nhưng điều đó không bắt buộc.

Những hạn chế

Bạn có thể sử dụng bất kỳ thư viện tiêu chuẩn mà ngôn ngữ của bạn cung cấp. Tiêu chuẩn áp dụng.

Điều kiện chiến thắng

Đây là , vì vậy chương trình nhỏ nhất (tính bằng byte) sẽ thắng. Trong trường hợp hòa, câu trả lời có nhiều phiếu nhất sẽ thắng.

Ghi chú

Điều này dựa trên câu hỏi của Ruby về SO đã tạo ra một số câu trả lời thú vị, bao gồm một câu hỏi rất ngắn. Tôi khuyến khích bạn đưa ra giải pháp của riêng bạn trước khi nhìn vào đó.


1
Tôi nghĩ rằng điều này sẽ tốt hơn, và câu trả lời bất hợp pháp tốt hơn, nếu nó không được quy định trước, và các cấp bậc cần thiết để giữ trật tự ban đầu của họ. Đó là [10, 4, 6, 0, 6, 10] sẽ là [1, 5, 3, 6, 3, 1]
Cruncher

Đó là một điểm tốt, @Cruncher; cảm thấy tự do để bắt đầu một chủ đề mới.
Jordan

Câu trả lời:


8

J ( 7 6)

EDIT: Oh, đợi đã! Nó không cần phải là một chức năng!

>:i.~y

Cảm ơn chúa vì i.~...

>:@:i.~

Hoặc là một hàm được đặt tên (thêm 3 ký tự, nhưng không khác về chức năng):

f=:>:@:i.~

Chạy thử nghiệm:

   f=:>:@:i.~
   f 10 10  6  6  4  0
1 1 3 3 5 6
   f 10  9  8
1 2 3
   f 0  0  0
1 1 1
   f 16 15 15 12 11 11 10  9  9  9  8  2  2  2  0
1 2 2 4 5 5 7 8 8 8 11 12 12 12 15

1
Quan tâm để nhận xét những gì này?
corsiKa

1
1+i.~là loại tàu có thể được gán và sử dụng nội tuyến, do đó có thể được sử dụng như một hàm mà không có các phép đào tạo thông thường. Đó là 5 ký tự. Và đối với bản ghi, @thực hiện công việc tương tự như @:trong trường hợp này, vì vậy bạn có thể lưu một nhân vật dễ dàng ở đó.
thuật toán

8

T-SQL (40)

SELECT RANK()OVER(ORDER BY B DESC)
FROM @

Giả sử @là một bảng chứa điểm số dưới dạng hàng.


3

Bình thường , 6

m'XYdY

Danh sách được lưu trữ trong Y để bắt đầu. Đây là chức năng tương tự như giải pháp ruby ​​22 ký tự: ánh xạ qua d trong Y thành chỉ số của d trong Y cộng 1, sau đó in.

Thí dụ:

$ echo "=Y[16 15 15 12 11 11 10 9 9 9 8 2 2 2 0)m'XYdY" | python3 pyth.py

[1, 2, 2, 4, 5, 5, 7, 8, 8, 8, 11, 12, 12, 12, 15]

3

Con trăn (33 ký tự)

lambda x:[1+x.index(i)for i in x]

Chức năng giống như câu trả lời J của tôi.


Vì đầu vào có thể ở định dạng bạn chọn, bạn có thể khai báo mảng sẽ được lưu trữ xđể bắt đầu và "xuất" nó bằng cách lưu trữ kết quả trong một biến.
isaacg

3

APL, 2 byte

⍳⍨

Trong ⎕IO←1. Dyadic iota tìm kiếm đối số bên phải của nó vào đối số bên trái của nó. Toán tử sao chép đối số bên phải sang đối số bên trái nếu toán hạng được sử dụng một cách đơn điệu. Do đó, giải pháp chỉ cần tìm kiếm vị trí của từng một trong các phần tử của vectơ được đưa ra.

Mẫu:

    ⍳⍨10 10 6  6  4  0
1 1 3 3 5 6
    ⍳⍨0  0  0 
1 1 1 
    ⍳⍨16 15 15 12 11 11 10  9  9  9  8  2  2  2  0
1 2 2 4 5 5 7 8 8 8 11 12 12 12 15

2

SỐ LIỆU (16)

egen b=rank(c),f

Kết quả là trong b.

Giả sử c là một biến trong bộ dữ liệu có chứa đầu vào.


1
Stata trong mã golf? Điều này thực sự mở một lon giun.
Shadowtalker

2

Haskell (31)

f x=succ.(`elemIndexJust`x)<$>x -- Requires the Safe module

Sử dụng:

f [10,10,6,6,4,0] --evaluates to [1,1,3,3,5,6]

giải pháp của tôi là r l=concat$tail$scanl(\s->map$const$length s+s!!0)[0]$group lvới 61 ký tự
tự hào

Ngoài ra, giải pháp đầu tiên của bạn không hoạt động vì hạn chế đơn hình
tự hào

Đó là hạn chế bệnh hoạn đáng sợ ... Tôi đã làm cho nó hoạt động trong GHCI, nhưng vì nó không được biên dịch nên tôi đoán tôi nên xóa nó ...
recursion.ninja

Bạn có thể làm lại để nó hoạt động
tự hào

1

Vì vậy, để thiết lập một đường cơ sở:

Hồng ngọc (38)

Giả sử alà một mảng:

r,i=1,0;a.map{|x|i+=1;x==a[i-2]?r:r=i}

(Điều này dựa trên câu trả lời của falsetru trên luồng SO gốc và không phải là tác phẩm gốc của tôi. Tôi biết có một giải pháp Ruby gồm 22 ký tự, nhưng tôi muốn thấy ai đó đến với một đoạn ngắn hơn Ruby.)


1

JavaScript (E6) 41

Một hàm với một đối số mảng, trả về một mảng

F=s=>s.map((n,i)=>p-n?(p=n,r=i+1):r,p=-1)

Kiểm tra trong bảng điều khiển Firefox

F([10,10,6,6,4,0])

Đầu ra: [1, 1, 3, 3, 5, 6]

F([16, 15, 15, 12, 11, 11, 10, 9, 9, 9, 8, 2, 2, 2, 0])

Đầu ra: [1, 2, 2, 4, 5, 5, 7, 8, 8, 8, 11, 12, 12, 12, 15]


1

R, 15

với đầu vào được lưu trữ dưới dạng vector x,

rank(-x,T,"mi")

1

Powershell (70)

$n=1;$c=0;$l=$a[0];$a|%{if($l-eq$_){$n}else{$n=$c+1;$n}$l=$a[$c];$c++}

Nó chỉ có 51 ký tự nếu bạn đưa ra các bài tập biến đổi lúc đầu, điều này khiến tôi cảm thấy hơi thiếu thốn.

Giả sử $ a được gán và sắp xếp theo quy định của vấn đề. $ n theo dõi thứ hạng, $ c chỉ là một bộ đếm hoạt động với $ l, phần tử cuối cùng được kiểm tra trong mảng.

Nếu có bất cứ điều gì tôi có thể làm để cải thiện điều này, tôi rất muốn biết.


1

Java (57)

Sử dụng cùng 'quy tắc' như Allbeert :

Hằng iđược định nghĩa là int[]mảng và chứa đầu vào,z chứa kích thước của đầu vào. Những người khác, l, c, xn, được định nghĩa là int.

Đoạn mã còn lại là:

l=0;c=1;for(x=0;x<z;x++){n=i[x];i[x]=n==l?c:(c=x+1);l=n;}

Kết quả là trong mảng đầu vào.


1

Ruby, 22

Tôi đã không nhìn vào chủ đề SO nhưng tôi tưởng tượng đây là những gì họ nghĩ ra.

a.map{|i|a.index(i)+1}

Chỉnh sửa: Đúng, đúng vậy. Tôi nghi ngờ có thể nhỏ hơn trong Ruby, trừ khi bạn cho rằng bạn xác định nó là phương thức Array, thì bạn có thể làm điều đó trong 18 ký tự với

map{|i|index(i)+1)

Nhưng tất nhiên, toàn bộ chương trình xung quanh đoạn trích đó trông giống như

class Array
  def ranks
    map{|i|index(i)+1)
  end
end

p [1, 2, 2, 4, 5, 5, 7, 8, 8, 8, 11, 12, 12, 12, 15].ranks

1

> <> (47)

Không được tối ưu hóa đặc biệt, chỉ thử nước với sân golf đầu tiên của tôi.

r:1:nr2&>ao$:@=?vr~&:|   
&1+&l3)?^;      >r:nr

Giả sử rằng đầu vào được chuẩn bị trước trong ngăn xếp, sao cho phần tử đầu tiên của đầu vào là đầu tiên được bật ra.

Kiểm tra:

fish.py ranks.fish -v 1 2 3 4 5 6 7 8 9 9 10 10

đầu ra

1
1
3
3
5
6
7
8
9
10
11
12

1
"thử nước" trong một lần gửi cá khiến tôi mỉm cười
Ingo Bürk

1

Clojure, 35

Với một số giao diện Java được trộn lẫn trong:

(fn[l](map #(+ 1(.indexOf l %)) l))

Phiên REPL:

golf> ((fn[l](map #(+ 1(.indexOf l %)) l)) [10 10  6  6  4  0])
(1 1 3 3 5 6)
golf> ((fn[l](map #(+ 1(.indexOf l %)) l)) [16 15 15 12 11 11 10  9  9  9  8  2  2  2  0])
(1 2 2 4 5 5 7 8 8 8 11 12 12 12 15)

0

C - 62

Là một đoạn mã, vì không có yêu cầu cho chức năng hoặc chương trình đầy đủ.

Giả định a, n, j, và kđã được định nghĩa là int*, int, int, và inttương ứng, nơi alà một mảng chứa đầu vào, vàn chứa chiều dài của đầu vào.

Điều này không thành công cho đầu vào có độ dài 0, trong trường hợp đó cần thêm 3 ký tự.

printf("1");for(k=j=1;++j<=n;)printf(" %d",*a-*(a+++1)?k=j:k);
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.