Сортировать эти рейтинги облигаций

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

Мы сортируем лексикографически по ключу, используя подход @ 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.

Попробуй это здесь . Тестовые случаи - это все рейтинги облигаций каждой рейтинговой схемы с добавлением дубликата.

lirtosiast
источник
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

В моем порядке сортировки по номерам числа сортируются перед буквами и -сортируются раньше +. Таким образом, эти символы транслитерируются в алфавитный диапазон, поэтому они сортируются в правильном порядке.

Попробуйте онлайн.

Цифровая травма
источник