เรียงลำดับการจัดอันดับพันธบัตรเหล่านี้


23

งาน

สถาบันจัดอันดับเครดิตให้คะแนนโดยกำหนดที่จะออกพันธบัตรตามเครดิตความคุ้มค่าของผู้ออกหุ้นกู้และ "บิ๊กทรี" หน่วยงานจัดอันดับเครดิตของใช้ที่คล้ายกัน ( แต่ไม่เหมือนกัน) ระบบการให้คะแนนฉัตร คำสั่งเหล่านี้มีคำสั่งที่ชัดเจนและสมเหตุสมผล - โดยใช้ระดับ S&P, AAA> AA +> AA> AA-> A +> ... > BBB> B> ... > C. C. Moody's ใช้ระบบที่คล้ายกัน แต่ตั้งชื่อชั้นต่างกัน ( Aaa> Aa1> Aa2> ... > Baa1> ... > C)

งานของคุณคือการออกแบบโปรแกรมที่ใช้เป็นรายการของสตริงที่แสดงระดับการจัดอันดับตราสารหนี้และส่งออกรายการเดียวกันเรียงลำดับจากมากไปหาน้อยจากระดับสูงสุด (AAA / Aaa) ถึงระดับต่ำสุด (C)

อินพุต / เอาต์พุต

คุณสามารถเลือกรูปแบบของอินพุต (รายการหนึ่งรายการต่ออาร์กิวเมนต์ไฟล์ CSV) คุณอาจจะคิดว่ารายการในรายการการป้อนข้อมูลที่ทุกคนเป็นสตริงคะแนนที่ถูกต้องและว่าทุกสตริงคะแนนในรายการมาจากหน่วยงานการให้คะแนนเดียวกัน นอกจากนี้คุณอาจคิดว่าจะไม่มีการให้คะแนนสไตล์ขี้ขลาดเช่น "NR" หรือ "WR" ซึ่งจะมีผลตั้งแต่ "Aaa / AAA" ถึง "C" เท่านั้น อาจมีการจัดอันดับซ้ำซ้อนในรายการอินพุตและหากพบว่าไม่ควรลบออก

คุณอาจเลือกรูปแบบของผลลัพธ์ตามความเหมาะสมกับภาษาของคุณโดยมีข้อ จำกัด เพียงอย่างเดียวคือควรเข้ารหัสเอาต์พุตข้อความมาตรฐานบางอย่างเช่น UTF-8 หรือ ASCII

กฎและการให้คะแนน

นี่คือรหัสกอล์ฟดังนั้นการชนะนับไบต์ต่ำสุดจึงไม่อนุญาตช่องโหว่มาตรฐาน โปรดระบุว่ารูปแบบอินพุตและเอาต์พุตคืออะไร

ตัวอย่างโปรแกรมและกรณีทดสอบ

ตัวอย่างโปรแกรม Python ด้านล่างนี้สามารถใช้เป็นตัวอย่างมาตรฐานของการเรียงลำดับที่ถูกต้อง รายการMoodyและSPเป็นลำดับที่จะใช้

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

กรณีทดสอบ

ในกรณีที่การจัดรูปแบบกรณีทดสอบแบบหลามไม่สะดวกฉันได้ส่งออกเป็นสตริงอินพุตที่คั่นด้วยช่องว่าง (จัดกลุ่มในอินพุตสองคู่คู่ตามด้วยเอาต์พุต):

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

หมายเหตุ : ฉันพูดถึง "Big Three" แต่ระบุ Moody's และ S&P ที่นี่เท่านั้น - เหตุผลที่สามคือ Fitch ใช้ระบบเดียวกับ S&P เมื่อคุณไม่คำนึงถึงการจัดอันดับสไตล์ NA ดังนั้นรวมถึง Fitch ซ้ำซาก


3
เพื่อนถ้านี่เป็นโพสต์แรกของคุณฉันประทับใจมาก +1
Addison Crump

9
@VoteToClose ผู้ฟังเป็นเวลานานผู้โทรครั้งแรก ;)
เปาโล

1
เอาต์พุตควรคำนึงถึงขนาดตัวพิมพ์หรือไม่?
andlrc

@ dev-null ใช่เอาต์พุตควรเป็นสตริงอินพุตเดียวกันที่เรียงลำดับใหม่
พอล

1
รายการอินพุตสามารถมีเรตติ้งเท่ากันหรือไม่? ถ้าเป็นเช่นนั้นควรจะเท่ากับเอาท์พุทหรือลบรายการที่ซ้ำกัน?
Digital Trauma

คำตอบ:


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ตัวอักษรที่ตามหลังมาและการทำให้เป็นคำกริยา,เราก็ต้องเรียงลำดับสตริงตามศัพท์

แก้ไข: บันทึกแล้ว 6 ไบต์ด้วย @ user81655


ความคิดดี. มันอาจจะสั้นลงอีกเล็กน้อยโดยการกำหนดฟังก์ชั่นแยกต่างหากสำหรับreplaceและการใช้$&ภายใน:a=>a.sort((b,c)=>(r=t=>t.replace(/[^A-z]*$/,"z$&,"))(b)>r(c)||-1)
user81655

@ user81655 อืมฉันเคยมี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

ในการเรียงลำดับของฉันสถานหมายเลขเรียงลำดับก่อนที่ตัวอักษรและการเรียงลำดับก่อน- +ดังนั้นตัวละครเหล่านี้จะถูกทับศัพท์ในช่วงตัวอักษรเพื่อเรียงลำดับที่ถูกต้อง

ลองออนไลน์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.