Sắp xếp các xếp hạng trái phiếu


23

Nhiệm vụ

Các cơ quan xếp hạng tín dụng chỉ định xếp hạng cho trái phiếu theo mức độ xứng đáng tín dụng của tổ chức phát hành và các tổ chức xếp hạng tín dụng "Big Three" sử dụng hệ thống xếp hạng theo cấp bậc tương tự (mặc dù không giống nhau) . Những thứ này có thứ tự rõ ràng, hợp lý - sử dụng các tầng S & P, AAA> AA +> AA> AA-> A +> ...> BBB> B> ...> C. Moody sử dụng một hệ thống tương tự, nhưng đặt tên các tầng của chúng khác nhau ( Aaa> Aa1> Aa2> ...> Baa1> ...> C).

Nhiệm vụ của bạn là thiết kế một chương trình lấy đầu vào là danh sách các chuỗi biểu thị các bậc xếp hạng trái phiếu và xuất ra cùng một danh sách, được sắp xếp theo thứ tự giảm dần từ tầng cao nhất (AAA / Aaa) đến tầng thấp nhất (C).

Đầu ra đầu vào

Bạn có thể chọn định dạng của đầu vào (danh sách, mỗi đối số, tệp CSV). Bạn có thể cho rằng mọi mục trong danh sách đầu vào là một chuỗi xếp hạng hợp lệ và tất cả các chuỗi xếp hạng trong danh sách đều đến từ cùng một cơ quan xếp hạng . Ngoài ra, bạn có thể cho rằng sẽ không có xếp hạng kiểu NA thú vị nào như "NR" hoặc "WR" - điều này hoàn toàn từ "Aaa / AAA" đến "C". Có thể có xếp hạng trùng lặp trong danh sách đầu vào, và nếu tìm thấy chúng không nên bị xóa.

Bạn cũng có thể chọn định dạng đầu ra phù hợp với ngôn ngữ của mình, với hạn chế duy nhất là nó phải xuất ra một số mã hóa văn bản tiêu chuẩn như UTF-8 hoặc ASCII.

Quy tắc và tính điểm

Đây là mã golf, vì vậy số byte thấp nhất sẽ thắng, các lỗ hổng tiêu chuẩn không được phép. Vui lòng xác định định dạng đầu vào và đầu ra là gì.

Ví dụ chương trình và trường hợp thử nghiệm

Ví dụ chương trình Python dưới đây có thể được sử dụng như một ví dụ tiêu chuẩn về thứ tự sắp xếp chính xác. Các danh sách MoodySPlà thứ tự để sử dụng.

Moody = ['Aaa', 'Aa1', 'Aa2', 'Aa3', 'A1', 'A2', 'A3',
         'Baa1', 'Baa2', 'Baa3', 'Ba1', 'Ba2', 'Ba3',
         'B1', 'B2', 'B3', 'Caa', 'Ca', 'C']

SP = ['AAA', 'AA+', 'AA', 'AA-', 'A+', 'A', 'A-',
      'BBB+', 'BBB', 'BBB-', 'BB+', 'BB', 'BB-',
      'B+', 'B', 'B-', 'CCC', 'CC', 'C']

test_cases = [
    (['Aa2', 'Aaa', 'Aa1'], ['Aaa', 'Aa1', 'Aa2']),
    (['AA', 'AA-', 'AA+'], ['AA+', 'AA', 'AA-']),
    (['Baa1', 'Ba1', 'A1', 'B1', 'Aaa', 'C', 'Caa', 'Aa1'],
     ['Aaa', 'Aa1', 'A1', 'Baa1', 'Ba1', 'B1', 'Caa', 'C']),
    (['BBB+', 'BB+', 'A+', 'B+', 'AAA', 'C', 'CCC', 'AA+'],
     ['AAA', 'AA+', 'A+', 'BBB+', 'BB+', 'B+', 'CCC', 'C']),
    (['B3', 'B1', 'B2'], ['B1', 'B2', 'B3']),
    (['B-', 'B+', 'B'], ['B+', 'B', 'B-']),
    (['B3', 'Caa', 'Aa1', 'Caa', 'Ca', 'B3'],
     ['Aa1', 'B3', 'B3', 'Caa', 'Caa', 'Ca']),
    (['B-', 'CCC', 'AA+', 'CCC', 'CC', 'B-'],
     ['AA+', 'B-', 'B-', 'CCC', 'CCC', 'CC'])
]

mdy_sort = lambda x: Moody.index(x)
sp_sort = lambda x: SP.index(x)

for l_in, l_out in test_cases:
    sort_key = mdy_sort if set(l_in).issubset(set(Moody)) else sp_sort
    assert sorted(l_in, key=sort_key) == l_out

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

Trong trường hợp định dạng trường hợp kiểm tra kiểu python không thuận tiện, tôi đã xuất nó dưới dạng chuỗi đầu vào được phân tách bằng dấu cách (được nhóm thành hai cặp đầu vào theo sau là đầu ra):

Aa2 Aaa Aa1
Aaa Aa1 Aa2

AA AA- AA+
AA+ AA AA-

Baa1 Ba1 A1 B1 Aaa C Caa Aa1
Aaa Aa1 A1 Baa1 Ba1 B1 Caa C

BBB+ BB+ A+ B+ AAA C CCC AA+
AAA AA+ A+ BBB+ BB+ B+ CCC C

B3 B1 B2
B1 B2 B3

B- B+ B
B+ B B-

B3 Caa Aa1 Caa Ca B3
Aa1 B3 B3 Caa Caa Ca

B- CCC AA+ CCC CC B-
AA+ B- B- CCC CCC CC

Lưu ý : Tôi đề cập đến "Big Three" nhưng chỉ nêu rõ Moody và S & P ở đây - lý do là Fitch thứ ba sử dụng cùng hệ thống với S & P khi bạn không tính đến xếp hạng theo kiểu NA, vì vậy bao gồm cả Fitch được dự phòng.


3
Anh bạn, nếu đây là bài viết đầu tiên của bạn, tôi rất ấn tượng. +1
Addison Crump

9
@VoteToC Đóng Trình nghe thời gian dài, người gọi lần đầu. ;)
Paul

1
Đầu ra có nên phân biệt chữ hoa chữ thường?
andlrc

@ dev-null Có, đầu ra phải là các chuỗi đầu vào giống nhau, được sắp xếp lại.
Paul

1
Danh sách đầu vào có thể chứa bất kỳ xếp hạng bằng nhau? Nếu vậy tất cả bằng nên là đầu ra, hoặc loại bỏ trùng lặp?
Chấn thương kỹ thuật số

Câu trả lời:


1

Bình thường, 16 byte

o+Xs}RGrN0N\z\,Q

Chúng tôi sắp xếp từ vựng theo khóa bằng cách sử dụng phương pháp của @ Neil. Đầu vào và đầu ra là danh sách; Điều này không làm thay đổi danh sách.

o+Xs}RGrN0N\z\,Q       Implicit: Q = input list
                        lambda N  (N is a bond rating)
       rN0               Convert N to lowercase
    }RG                  Map is-in G, the lowercase alphabet.
   s                     Sum the list of bools; the number of letters in N.
  X       N\z            Insert "z" at that position in N.
 +           \,          Append "," to the end.
                         This works because "," is between "+" and "-" lexicographically.
o              Q       Sort Q, using that lambda as a key.

Hãy thử nó ở đây . Các trường hợp thử nghiệm là tất cả các xếp hạng trái phiếu của từng sơ đồ xếp hạng, với một bản sao được ném vào.


7

ES6, 71 65 byte

a=>a.sort((b,c)=>r(b)>r(c)||-1,r=s=>s.replace(/[^A-z]*$/,"z$&,"))

Bằng cách chèn a zsau các chữ cái và hậu tố a, ,chúng ta chỉ cần sắp xếp các chuỗi theo từ vựng.

Chỉnh sửa: Đã lưu 6 byte nhờ @ user81655.


Ý kiến ​​hay. Nó cũng có thể ngắn hơn một chút bằng cách xác định một chức năng riêng cho replacevà sử dụng $&bên trong nó:a=>a.sort((b,c)=>(r=t=>t.replace(/[^A-z]*$/,"z$&,"))(b)>r(c)||-1)
user81655

@ user81655 Bah, ban đầu tôi đã có s="$1z$2,"và mặc dù tôi nhận ra rằng tôi có thể chơi gôn $1nhưng điều đó đã xảy ra với tôi rằng bây giờ tôi cũng có thể chơi golf $2...
Neil

2

Tiện ích Bash + GNU, 45

Tín dụng là do @Neil cho cách tiếp cận .

sed s/$/e/|tr +-3 d-l|sort|tr -d e|tr d-l +-3

Theo thứ tự địa phương của tôi, các số sắp xếp trước các chữ cái và -sắp xếp trước +. Vì vậy, các ký tự này được phiên âm vào phạm vi bảng chữ cái để chúng sắp xếp theo đúng thứ tự.

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

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.