排序这些债券评级


23

任务

信用评级机构指定分级债券根据发行人的信用度,而“三巨头”信用评级机构使用类似(虽然不完全相同)分层分级系统。它们具有明确的逻辑顺序-使用S&P层,AAA> AA +> AA> AA-> A +> ...> BBB> B> ...> C.穆迪使用相似的系统,但对它们的层命名不同( Aaa> Aa1> Aa2> ...> Baa1> ...> C)。

您的任务是设计一个程序,该程序将代表债券评级层的字符串列表作为输入,并输出相同的列表,并按从最高层(AAA / Aaa)到最低层(C)的降序排列。

输入输出

您可以选择输入的格式(列表,每个自变量一个,CSV文件)。您可以假定输入列表中的每个项目都是有效的评级字符串,并且列表中的所有评级字符串均来自同一评级机构。此外,您可能会假设不包含任何时髦的NA风格评级,例如“ NR”或“ WR”-严格从“ Aaa / AAA”到“ C”。输入列表中可能有重复的评分,如果发现,则不应删除它们。

您还可以选择适合您的语言的输出格式,唯一的限制是输出的格式应该是一些标准的文本编码,例如UTF-8或ASCII。

规则和计分

这是代码高尔夫,因此最低字节数获胜,不允许出现标准漏洞。请指定输入和输出格式。

示例程序和测试用例

下面的示例Python程序可以用作正确排序顺序的标准示例。列表MoodySP是要使用的订购。

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

测试用例

如果python风格的测试用例格式不方便,我将其输出为以空格分隔的输入字符串(分为两行,然后是输出):

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

注意:我提到的是“三巨头”,但在此仅指定穆迪和标准普尔-原因是当您不考虑NA风格的评级时,第三种Fitch与标准普尔使用相同的系统,因此包括Fitch是多余的。


3
杜德(Dude),如果这是您的第一篇文章,那该给我留下深刻的印象。+1
Addison Crump

9
@VoteToClose长时间的监听者,首次调用者。;)
Paul

1
输出应该区分大小写吗?
andlrc

@ dev-null是,输出应该是相同的输入字符串,并重新排序。
保罗

1
输入列表可以包含任何相等的评级吗?如果是这样,应该输出所有等式,还是删除重复项?
Digital Trauma

Answers:


1

Pyth,16个字节

o+Xs}RGrN0N\z\,Q

我们使用@Neil的方法按关键字从大到小排序。输入和输出为列表;这不会改变列表。

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.

在这里尝试。测试用例是每个评级方案的所有债券评级,并且有重复。


7

ES6,71 65个字节

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

通过z在字母后面插入a 并加a作为后缀,,我们仅需按词法对字符串进行排序。

编辑:由于@ user81655,节省了6个字节。


好主意。通过为replace和定义单独的函数并$&在其中使用,它可能会更短一些:a=>a.sort((b,c)=>(r=t=>t.replace(/[^A-z]*$/,"z$&,"))(b)>r(c)||-1)
user81655,2016年

@ user81655 Bah,我原来有s="$1z$2,",虽然我意识到我可以打高尔夫球,但我$1没有想到现在我也可以打高尔夫球$2……
Neil

2

Bash + GNU实用程序,45

该方法归功于@Neil 。

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

按照我的语言环境排序顺序,数字在字母-之前排序,在之前排序+。因此,这些字符被音译到字母范围内,因此它们以正确的顺序排序。

在线尝试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.