これらの債券格付けを並べ替える


23

タスク

信用格付機関発行体の信用度に応じて債券へのアサイン評価、そして「ビッグスリー」の信用格付機関は、同様の(ただし同一ではない)を使用する階層型評価システムを。これらには明確で論理的な順序があります-S&Pティアを使用して、AAA> AA +> AA> AA-> A +> ...> BBB> B> ...> C. Aaa> Aa1> Aa2> ...> Baa1> ...> C)。

あなたの仕事は、債券格付け層を表す文字列のリストを入力として受け取り、同じリストを出力し、最高層(AAA / Aaa)から最低層(C)に降順でソートするプログラムを設計することです。

入出力

入力の形式(リスト、引数ごとに1つ、CSVファイル)を選択できます。入力リスト内のすべての項目が有効な評価文字列であり、リスト内のすべての評価文字列が同じ評価機関からのものである想定できます。さらに、「NR」や「WR」などのファンキーなNAスタイルの評価は一切含まれないと想定することができます-これは厳密に「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スタイルのテストケースの書式設定が不便な場合は、スペースで区切られた入力文字列として出力しました(2行のペアの入力の後に出力が続きます)。

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

:「ビッグスリー」について言及しますが、ここではムーディーズとS&Pのみを指定します。理由は、3番目のフィッチは、NAスタイルの評価を考慮しない場合、S&Pと同じシステムを使用するためです。冗長である。


3
おい、これがあなたの最初の投稿なら、私は非常に感銘を受けた。+1
アディソンクランプ

9
@VoteToClose長時間のリスナー、最初の呼び出し元。;)
ポール

1
出力では大文字と小文字を区別する必要がありますか?
andlrc

@ dev-nullはい、出力は同じ入力文字列で、並べ替えられる必要があります。
ポール

1
入力リストに同等の評価を含めることはできますか?もしそうなら、すべて等しいを出力するか、重複を削除しますか?
デジタル外傷

回答:


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,ことで、文字列を字句的にソートするだけです。

編集:@ user81655のおかげで6バイトを保存しました。


良いアイデア。また、別の関数を定義しreplace$&内部で使用することにより、少し短くすることもできますa=>a.sort((b,c)=>(r=t=>t.replace(/[^A-z]*$/,"z$&,"))(b)>r(c)||-1)
。– user81655

@ user81655フン、私はもともと持っていたs="$1z$2,"と私は私がゴルフを離れたことができることを実現するが$1、それは離れてゴルフ今私ができるように私には起きていなかった$2、あまりにも...
ニール

2

Bash + GNUユーティリティ、45

クレジットは、アプローチの @Neilによるものです。

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

私のロケールのソート順では、数字は文字の前にソートされ、前に-ソートされ+ます。したがって、これらの文字はアルファベットの範囲に音訳され、正しい順序で並べ替えられます。

オンラインでお試しください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.