Задание
В кредитных рейтинговых агентств рейтинги приписывать облигаций в соответствии с кредитоспособности эмитента, а также кредитный рейтинг агентства «большой тройки» используют аналогичный (хотя и не идентичные) многоуровневую систему рейтинга . Они имеют четкий, логичный порядок - используя уровни 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 будет быть избыточным.
Ответы:
Pyth, 16 байт
Мы сортируем лексикографически по ключу, используя подход @ Neil. Ввод и вывод в виде списков; это не изменяет список.
Попробуй это здесь . Тестовые случаи - это все рейтинги облигаций каждой рейтинговой схемы с добавлением дубликата.
источник
ES6,
7165 байтВставляя
z
после букв и суффикс а,,
мы просто должны отсортировать строки лексически.Изменить: Сохранено 6 байтов благодаря @ user81655.
источник
replace
и использовать ее$&
внутри:a=>a.sort((b,c)=>(r=t=>t.replace(/[^A-z]*$/,"z$&,"))(b)>r(c)||-1)
s="$1z$2,"
и хотя я понял, что могу играть в гольф,$1
мне не пришло в голову, что теперь я$2
тоже могу играть в гольф ...Утилиты Bash + GNU, 45
Кредит за @Neil за подход .
В моем порядке сортировки по номерам числа сортируются перед буквами и
-
сортируются раньше+
. Таким образом, эти символы транслитерируются в алфавитный диапазон, поэтому они сортируются в правильном порядке.Попробуйте онлайн.
источник