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 Moody
dan SP
pemesanan 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.
Jawaban:
Pyth, 16 byte
Kami mengurutkan secara leksikografis berdasarkan kunci menggunakan pendekatan @ Neil. Input dan output adalah sebagai daftar; ini tidak mengubah daftar.
Coba di sini . Kasus uji adalah semua peringkat obligasi dari setiap skema peringkat, dengan duplikat dilemparkan ke dalamnya.
sumber
ES6,
7165 byteDengan menyisipkan
z
huruf setelah dan akhiran a,
kita hanya perlu mengurutkan string secara leksikal.Sunting: Disimpan 6 byte berkat @ user81655.
sumber
replace
dan menggunakannya$&
di dalamnya:a=>a.sort((b,c)=>(r=t=>t.replace(/[^A-z]*$/,"z$&,"))(b)>r(c)||-1)
s="$1z$2,"
dan meskipun saya menyadari bahwa saya bisa bermain golf$1
itu tidak terpikir oleh saya bahwa saya sekarang bisa bermain golf$2
juga ...Utilitas Bash + GNU, 45
Kredit adalah karena @Neil untuk pendekatan tersebut .
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.
sumber