Сортуйте ці рейтинги облігацій


23

Завдання

У кредитних рейтингових агентств рейтинги приписувати облігацій в відповідно до кредитоспроможності емітента, а також кредитний рейтинг агентства «великої трійки» використовують аналогічний (хоча і з ідентичні) багаторівневу систему рейтингу . Вони мають чіткий логічний порядок - використовуючи яруси S&P, AAA> AA +> AA> AA-> A +> ...> BBB> B> ...> C. Moody's використовує подібну систему, але їхні рівні називають по-різному ( Aaa> Aa1> Aa2> ...> Baa1> ...> C).

Ваше завдання - розробити програму, яка бере на вхід список рядків, що представляють рівні рейтингу облігацій, та виводить той самий список, відсортований у порядку зменшення від найвищого рівня (AAA / Aaa) до найнижчого рівня (C).

Введення-виведення

Ви можете вибрати формат введення (список, по одному на аргумент, CSV-файл). Ви можете припустити, що кожен елемент списку вхідних даних є дійсним рядком рейтингу і що всі рядки рейтингу у списку надходять із одного рейтингового агентства . Крім того, ви можете припустити, що жоден із прикольних рейтингів у стилі NA, таких як "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

Тестові справи

У випадку, якщо форматування тестового випадку в стилі python є незручним, я виводить його у вигляді вхідних рядків, обмежених простором (згруповані у вхідні дворядкові пари з поданням на вихід):

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

Примітка : я згадую "Велику трійку", але тут вказую лише Moody's та S&P - причина полягає в тому, що третій, Fitch, використовує ту саму систему, що і S&P, коли ви не враховуєте рейтинги в стилі NA, тому включаючи Fitch, бути зайвими.


3
Чувак, якщо це твоя перша посада, я, чорт, добре вражений. +1
Аддісон Кримп

9
@VoteToClose Слухач тривалий час, хто телефонує вперше. ;)
Пол

1
Чи повинен вивід у регістрі?
andlrc

@ dev-null Так, висновок повинен бути однаковим вхідним рядком, упорядкованим.
Пол

1
Чи можуть вхідні списки містити будь-які рівні оцінки? Якщо так, чи слід виводити всі рівні або видаляти дублікати?
Цифрова травма

Відповіді:


1

Pyth, 16 байт

o+Xs}RGrN0N\z\,Q

Ми сортуємо лексикографічно за ключем, використовуючи підхід @ Ніла. Введення та вихід є списками; це не змінює список.

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теж можу гольф віддалитися ...
Ніл,

2

Bash + GNU комунальні послуги, 45

Кредит належить @Neil за підхід .

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

У моєму локальному порядку сортування цифри сортують перед літерами та - раніше +. Таким чином, ці символи транслітеруються в діапазон алфавіту, щоб вони сортувались у правильному порядку.

Спробуйте в Інтернеті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.