Sortieren Sie diese Anleiheratings

23

Die Aufgabe

Die Ratingagenturen ordnen Anleihen Ratings entsprechend der Bonität des Emittenten zu, und die "Big Three" - Ratingagenturen verwenden ein ähnliches (wenn auch nicht identisches) abgestuftes Ratingsystem . Diese haben eine klare, logische Reihenfolge - unter Verwendung der S & P-Stufen AAA> AA +> AA> AA-> A +> ...> BBB> B> ...> C. Moody's verwendet ein ähnliches System, benennt ihre Stufen jedoch anders ( Aaa> Aa1> Aa2> ...> Baa1> ...> C).

Ihre Aufgabe ist es, ein Programm zu entwerfen, das als Eingabe eine Liste von Zeichenfolgen verwendet, die die Ratingstufen der Anleihen darstellen, und dieselbe Liste in absteigender Reihenfolge von der höchsten Stufe (AAA / Aaa) bis zur niedrigsten Stufe (C) ausgibt.

Input-Output

Sie können das Format der Eingabe auswählen (Liste, eines pro Argument, CSV-Datei). Sie können davon ausgehen, dass jedes Element in der Eingabeliste eine gültige Bewertungszeichenfolge ist und dass alle Bewertungszeichenfolgen in einer Liste von derselben Bewertungsagentur stammen . Darüber hinaus können Sie davon ausgehen, dass keine der funky NA-Stil Bewertungen wie "NR" oder "WR" enthalten sein wird - dies ist ausschließlich von "Aaa / AAA" bis "C". Möglicherweise enthält die Eingabeliste doppelte Bewertungen. Wenn sie gefunden werden, sollten sie nicht entfernt werden.

Sie können auch das Format der Ausgabe auswählen, das für Ihre Sprache geeignet ist. Die einzige Einschränkung besteht darin, dass Standardtextcodierungen wie UTF-8 oder ASCII ausgegeben werden sollen.

Regeln und Wertung

Dies ist Codegolf, daher gewinnt die niedrigste Byteanzahl, Standardlücken sind nicht zulässig. Bitte geben Sie das Eingabe- und Ausgabeformat an.

Beispielprogramm und Testfälle

Das folgende Beispiel-Python-Programm kann als Standardbeispiel für die richtige Sortierreihenfolge verwendet werden. Die Listen Moodyund SPsind die zu verwendenden Ordnungen.

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

Testfälle

Falls die Formatierung des Testfalls im Python-Stil unpraktisch ist, habe ich sie als durch Leerzeichen getrennte Eingabezeichenfolgen ausgegeben (gruppiert in zweizeiligen Paaren, Eingabe gefolgt von Ausgabe):

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

Hinweis : Ich erwähne die "Big Three", aber spezifiziere hier nur Moody's und S & P. ​​Der Grund dafür ist, dass das dritte, Fitch, dasselbe System wie S & P verwendet, wenn Sie die NA-Ratings nicht berücksichtigen, also auch Fitch überflüssig sein.

Paul
quelle
3
Alter, wenn dies dein erster Beitrag ist, bin ich verdammt beeindruckt. +1
Addison Crump
9
@VoteToClose Langzeithörer, erster Anrufer. ;)
Paul
1
Sollte die Ausgabe zwischen Groß- und Kleinschreibung unterscheiden?
andlrc
@ dev-null Ja, bei der Ausgabe sollte es sich um die gleichen Eingabezeichenfolgen handeln, die neu angeordnet wurden.
Paul
1
Können die Eingabelisten gleiche Bewertungen enthalten? Wenn ja, sollten alle gleich ausgegeben werden oder Duplikate entfernen?
Digital Trauma

Antworten:

1

Pyth, 16 Bytes

o+Xs}RGrN0N\z\,Q

Wir sortieren lexikographisch nach einem Schlüssel nach dem @ Neil-Ansatz. Eingabe und Ausgabe erfolgen als Listen. Dies ändert nichts an der Liste.

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.

Probieren Sie es hier aus . Testfälle sind alle Anleiheratings jedes Rating-Schemas, wobei ein Duplikat eingeworfen wird.

Lirtosiast
quelle
7

ES6, 71 65 Bytes

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

Durch das Einfügen eines znach den Buchstaben und das Suffixieren eines müssen ,wir die Zeichenfolgen nur lexikalisch sortieren.

Bearbeiten: 6 Bytes dank @ user81655 gespeichert.

Neil
quelle
Gute Idee. Es könnte auch etwas kürzer sein, indem Sie eine separate Funktion für das definieren replaceund $&diese verwenden:a=>a.sort((b,c)=>(r=t=>t.replace(/[^A-z]*$/,"z$&,"))(b)>r(c)||-1)
user81655
@ user81655 Bah, ich hatte ursprünglich s="$1z$2,"und obwohl ich merkte, dass ich weggolfen konnte $1, war mir nicht eingefallen, dass ich jetzt auch weggolfen konnte $2...
Neil
2

Bash + GNU-Dienstprogramme, 45

Die Gutschrift erfolgt bei @Neil für den Ansatz .

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

In meiner Gebietsschemasortierreihenfolge sortieren Zahlen vor Buchstaben und sortieren -vor +. Diese Zeichen werden also in den Alphabetbereich transkribiert, damit sie in der richtigen Reihenfolge sortiert werden.

Probieren Sie es online aus.

Digitales Trauma
quelle