이 채권 등급 정렬


23

작업

신용 평가 기관 발행자의 신용 가치 있음에 따라 채권에 할당 평가하고 "큰 세"신용 평가 기관도 비슷한 (하지만 동일하지)를 사용 계층 평가 시스템을 . S & P 계층, ​​AAA> AA +> AA> AA-> A +> ...> BBB> B> ...> C를 사용하여 명확하고 논리적 인 순서를 갖습니다. Moody 's는 유사한 시스템을 사용하지만 계층 이름을 다르게 지정합니다 ( Aaa> Aa1> Aa2> ...> Baa1> ...> C).

귀하의 임무는 채권 등급 등급을 나타내는 문자열 목록을 입력으로 사용하고 최상위 등급 (AAA / Aaa)에서 최저 등급 (C)까지 내림차순으로 정렬 된 동일한 목록을 출력하는 프로그램을 설계하는 것입니다.

입출력

입력 형식 (목록, 인수 당 하나, CSV 파일)을 선택할 수 있습니다. 입력 목록의 모든 항목이 유효한 등급 문자열 이고 목록의 모든 등급 문자열이 동일한 등급 기관 에서 온 것으로 가정 할 수 있습니다 . 또한 "NR"또는 "WR"과 같은 펑키 NA 스타일 등급은 포함되지 않는다고 가정 할 수 있습니다. 이는 "Aaa / AAA"에서 "C"까지입니다. 입력 목록에 중복 된 등급이있을 수 있으며 발견 된 경우 제거하지 않아야합니다.

언어에 따라 출력 형식을 선택할 수도 있지만 UTF-8 또는 ASCII와 같은 일부 표준 텍스트 인코딩을 출력해야한다는 제한이 있습니다.

규칙과 득점

이것은 코드 골프이므로 바이트 수가 가장 적고 표준 허점이 허용되지 않습니다. 입력 및 출력 형식을 지정하십시오.

예제 프로그램 및 테스트 사례

아래의 파이썬 프로그램 예제는 올바른 정렬 순서의 표준 예제로 사용될 수 있습니다. 목록 MoodySP사용할 순서입니다.

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

테스트 사례

파이썬 스타일의 테스트 케이스 형식이 불편한 경우 공백으로 구분 된 입력 문자열로 출력했습니다 (2 줄 쌍 입력으로 그룹화 한 다음 출력).

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를 포함하여 NA 스타일 등급을 고려하지 않을 때 세 번째 Fitch가 S & P와 동일한 시스템을 사용하기 때문입니다. 중복됩니다.


3
친구, 이것이 당신의 첫 번째 게시물이라면, 나는 매우 감동받습니다. +1
Addison Crump

9
@VoteToClose 장시간 청취자, 최초 발신자. ;)
Paul

1
출력은 대소 문자를 구분해야합니까?
andlrc

@ dev-null 예, 출력은 순서가 동일한 입력 문자열이어야합니다.
Paul

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뒤에 문자 를 삽입 하고 접미사를 붙이면 ,문자열을 어휘 적으로 정렬하면됩니다.

편집 : @ user81655 덕분에 6 바이트가 절약되었습니다.


좋은 생각. 또한 별도의 함수를 정의하고 그 내부를 replace사용하여 조금 더 짧을 수도 있습니다 $&.a=>a.sort((b,c)=>(r=t=>t.replace(/[^A-z]*$/,"z$&,"))(b)>r(c)||-1)
user81655

@ user81655 Bah, 나는 원래 가지고 s="$1z$2,"있었지만 골프를 할 수 있다는 것을 깨달았지만 지금은 골프도 할 수 없다는 것이 나 $1에게 일어나지 않았다 $2...
Neil

2

배쉬 + 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.