Urutkan peringkat obligasi ini

23

Tugas

The lembaga pemeringkat kredit peringkat assign untuk obligasi sesuai dengan kelayakan kredit dari penerbit, dan "Big Three" lembaga pemeringkat kredit menggunakan yang sama (meskipun tidak identik) sistem rating berjenjang . Ini memiliki urutan yang jelas dan logis - menggunakan tingkatan S&P, AAA> AA +> AA> AA-> A +> ...> BBB> B> ...> C. Moody's menggunakan sistem yang sama, tetapi menamai tingkatan mereka secara berbeda ( Aaa> Aa1> Aa2> ...> Baa1> ...> C).

Tugas Anda adalah merancang program yang memasukkan input string yang mewakili tingkatan peringkat obligasi dan menampilkan daftar yang sama, diurutkan dalam urutan menurun dari tingkat tertinggi (AAA / Aaa) ke tingkat terendah (C).

Input output

Anda dapat memilih format input (daftar, satu per argumen, file CSV). Anda dapat mengasumsikan bahwa setiap item dalam daftar input adalah string peringkat yang valid dan bahwa semua string peringkat dalam daftar berasal dari agen peringkat yang sama . Selain itu, Anda dapat mengasumsikan bahwa tidak ada peringkat gaya-NA yang funky seperti "NR" atau "WR" akan dimasukkan - ini hanya dari "Aaa / AAA" hingga "C". Mungkin ada peringkat duplikat dalam daftar input, dan jika ditemukan mereka tidak boleh dihapus.

Anda juga dapat memilih format output sesuai dengan bahasa Anda, dengan satu-satunya batasan adalah bahwa itu harus mengeluarkan beberapa pengkodean teks standar seperti UTF-8 atau ASCII.

Aturan dan penilaian

Ini adalah kode golf, sehingga jumlah byte terendah menang, celah standar tidak diizinkan. Silakan tentukan apa format input dan outputnya.

Contoh program dan uji kasus

Contoh program Python di bawah ini dapat digunakan sebagai contoh standar dari urutan sortir yang benar. Daftar Moodydan SPpemesanan untuk digunakan.

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

Uji kasus

Jika pemformatan kasus uji gaya-python tidak nyaman, saya telah mengeluarkannya sebagai string input yang dibatasi ruang (dikelompokkan dalam input berpasangan dua baris diikuti dengan keluaran):

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

Catatan : Saya menyebut "Tiga Besar" tetapi hanya menentukan Moody dan S&P di sini - alasannya adalah yang ketiga, Fitch, menggunakan sistem yang sama dengan S&P ketika Anda tidak memperhitungkan peringkat gaya-NA, jadi termasuk Fitch akan melimpah.

Paul
sumber
3
Kawan, jika ini posting pertama Anda, saya sangat terkesan. +1
Addison Crump
9
@VoteToTutup Pendengar lama, penelepon pertama kali. ;)
Paul
1
Haruskah output menjadi case sensitif?
andlrc
@ dev-null Ya, output harus berupa string input yang sama, disusun ulang.
Paul
1
Bisakah daftar input berisi peringkat yang sama? Jika demikian, apakah semua yang sama harus dihasilkan, atau menghapus duplikat?
Digital Trauma

Jawaban:

1

Pyth, 16 byte

o+Xs}RGrN0N\z\,Q

Kami mengurutkan secara leksikografis berdasarkan kunci menggunakan pendekatan @ Neil. Input dan output adalah sebagai daftar; ini tidak mengubah daftar.

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.

Coba di sini . Kasus uji adalah semua peringkat obligasi dari setiap skema peringkat, dengan duplikat dilemparkan ke dalamnya.

lirtosiast
sumber
7

ES6, 71 65 byte

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

Dengan menyisipkan zhuruf setelah dan akhiran a ,kita hanya perlu mengurutkan string secara leksikal.

Sunting: Disimpan 6 byte berkat @ user81655.

Neil
sumber
Ide bagus. Itu juga bisa menjadi sedikit lebih pendek dengan mendefinisikan fungsi terpisah untuk replacedan menggunakannya $&di dalamnya:a=>a.sort((b,c)=>(r=t=>t.replace(/[^A-z]*$/,"z$&,"))(b)>r(c)||-1)
user81655
@ user81655 Bah, awalnya saya punya s="$1z$2,"dan meskipun saya menyadari bahwa saya bisa bermain golf $1itu tidak terpikir oleh saya bahwa saya sekarang bisa bermain golf $2juga ...
Neil
2

Utilitas Bash + GNU, 45

Kredit adalah karena @Neil untuk pendekatan tersebut .

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

Dalam urutan pengurutan lokal saya, angka mengurutkan sebelum huruf dan -mengurutkan sebelumnya +. Jadi karakter ini ditransliterasikan ke dalam rentang alfabet sehingga mereka mengurutkan dalam urutan yang benar.

Cobalah online.

Trauma Digital
sumber