Bu tahvil derecelendirmelerini sırala


23

Görev

Kredi derecelendirme kuruluşları veren kredi kullanabilme göre tahvillerine atama derecelendirme ve "Üç Büyük" kredi derecelendirme kuruluşları da benzer (gerçi aynı değil) kullanan katmanlı bir derecelendirme sistemi . Bunların net ve mantıklı bir düzeni var - S&P katmanları, AAA> AA +> AA> AA-> A +> ...> BBB> B> ...> C kullanılarak. Moody's benzer bir sistem kullanıyor, Aaa> Aa1> Aa2> ...> Baa1> ...> C).

Göreviniz, tahvil derecelendirme katmanlarını temsil eden dizelerin bir listesini girdi olarak alan ve aynı listeyi çıkaran, en yüksek seviyeden (AAA / Aaa) en düşük seviyeye (C) kadar azalan bir program tasarlamaktır.

Giriş çıkış

Girişin biçimini seçebilirsiniz (liste, bağımsız değişken başına bir tane, CSV dosyası). Giriş listesindeki her öğenin geçerli bir derecelendirme dizesi olduğunu ve listedeki tüm derecelendirme dizelerinin aynı derecelendirme kuruluşundan geldiğini varsayabilirsiniz . Ek olarak, "NR" veya "WR" gibi ilginç NA tarzı derecelendirmelerden hiçbirinin eklenmeyeceğini de varsayabilirsiniz - bu kesinlikle "Aaa / AAA" dan "C" ye kadardır. Giriş listesinde yinelenen derecelendirmeler olabilir ve bulunursa kaldırılmaması gerekir.

Çıktının biçimini dilinize uygun olarak da seçebilirsiniz; tek kısıtlama UTF-8 veya ASCII gibi bazı standart metin kodlamaları çıkarmasıdır.

Kurallar ve puanlama

Bu kod golf, bu yüzden en düşük bayt sayısı kazanır, standart boşluklara izin verilmez. Lütfen giriş ve çıkış formatının ne olduğunu belirtin.

Örnek program ve test durumları

Aşağıdaki örnek Python programı, doğru sıralama düzeninin standart bir örneği olarak kullanılabilir. Listeler Moodyve SPkullanılacak siparişlerdir.

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

Test durumları

Python tarzı test durumunun biçimlendirmesinin sakıncalı olması durumunda, bunu alanla ayrılmış girdi dizeleri olarak çıktım (çıktıyı izleyen iki satırlık çiftler halinde gruplandırılmış):

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

Not : "Büyük Üç" ten bahsediyorum ama burada sadece Moody's ve S&P'yi belirtiyorum - bunun nedeni, üçüncü Fitch’in, NA tarzı derecelendirmeleri hesaba katmadığınızda S&P ile aynı sistemi kullanmasıdır. gereksiz olmak.


3
Dostum, eğer bu ilk mesajınsa, çok etkilendim. +1
Addison Crump,

9
@VoteToClose Uzun süre dinleyici, ilk kez arayan. ;)
Paul,

1
Çıktı büyük / küçük harf duyarlı olmalı mı?
andlrc

@ dev-null Evet, çıktı aynı giriş dizeleri olmalı, yeniden sıralanmalıdır.
Paul,

1
Giriş listeleri herhangi bir eşit derecelendirme içerebilir mi? Eğer öyleyse, tüm eşittir çıktı mı yoksa çiftleri mi kaldırmalı?
Dijital Travma

Yanıtlar:


1

Pyth, 16 bayt

o+Xs}RGrN0N\z\,Q

@ Neil'in yaklaşımını kullanarak sözlük bilgisini anahtar olarak sıralarız. Giriş ve çıkış listelerdir; bu, listeyi değiştirmez.

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.

Burada dene . Test senaryoları, her bir yineleme düzeninin, bir yinelenen atılmış durumdaki tüm notlardır.


7

ES6, 71 65 bayt

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

zHarflerin arkasına bir harf ekleyip son ekleyerek ,dizeleri sözcüksel olarak sıralamamız gerekir.

Düzenleme: @ user81655 sayesinde 6 bayt kaydedildi.


İyi fikir. Bunun için ayrı bir işlev tanımlayarak replaceve $&onu kullanarak da biraz daha kısa olabilir:a=>a.sort((b,c)=>(r=t=>t.replace(/[^A-z]*$/,"z$&,"))(b)>r(c)||-1)
user81655

@ user81655 Bah, orjinalde yaptım s="$1z$2,"ve golf oynayabildiğimi fark etmeme rağmen, şimdi de golf oynayabileceğimi fark $1etmemiştim $2...
Neil

2

Bash + GNU yardımcı programları, 45

Kredi yaklaşımı için @ Neil kaynaklanmaktadır .

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

Yerel sıralama düzenimde, sayılar harflerden önce sıralanır ve -önce sıralar +. Böylece bu karakterler alfabe aralığına çevrilir, böylece doğru sıraya göre sıralanırlar.

Çevrimiçi deneyin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.