Şifreli Romen rakamlarını Arapça ondalık sayılara dönüştürme


16

Bir harf dizisini Romen rakamı olarak yorumlamak için bir algoritma yazın. (aşağıdaki romen rakam kurallarına bakın)

Her ayrı harfin eşleşen bir Arapça ondalık değeri vardır, maksimum değil. Ama önceden anahtarın yok, yani{A=10, I=1, X=5, ... Z=1000000} yorumunuza karar verilir.

Meydan okuma

  1. Girişi STDINveya eşdeğeri üzerinden okuma ve çıkışı STDOUTveya eşdeğeri üzerinden yazma
  2. Geçerli girişler, büyük ve küçük harf kombinasyonlarıdır; \[a-zA-Z]+\
  3. Harf dizisinin geçerli Romen rakamı olarak yorumlanıp yorumlanamayacağını görmek için giriş doğrulanmalıdır
  4. Giriş doğrulaması geçerse, geçerli çıkış düşük Arapça ondalık yorumlanması olmalı ve anahtar yani kullanılan Aaolarak yorumlanır 4 {a=5, A=1} değil 6 {A=5, a=1} ya 9 {a=10, a=1}

Romen Rakamıyla İlgili Kurallar

  1. Sadece on gücü temsil eden harfler tekrarlanabilir, en fazla üç kez art arda ve toplamda dört kez örn. II III XXXIX

  2. Bir veya daha fazla harf daha değerli başka bir harfin arkasına yerleştirilirse, bu miktarı ekleyin

    AAaa   => 22 {A=10, a=1}          (20 + 2 = 22)  
    bbAAaa => 222 {b=100, A=10, a=1}  (200 + 20 + 2 = 222)   
    
  3. Bir harf daha değerli başka bir harfin önüne yerleştirilirse, bu miktarı çıkarın

    Aa    => 4 {a=5, A=1}                 (5 – 1 = 4)  
    AaA   => 19 {A=10, a=1}               (10 + 10 – 1 = 19)  
    BbBaA => 194 {B=100, b=10, A=5, a=1}  (100 + 100 - 10 + 5 - 1 = 194)  
    

    Romen rakamlarından miktar çıkarmak için çeşitli kurallar geçerlidir:

    • Sadece çıkarma on ie güçler 1, 10, 100... değil 5, 50, 500...
    • Hiçbir çift çıkarma dolayısıyla 18olarak yazılır XVIII değil IIXX (10 + 10 - 1 - 1)
    • On kat daha büyük bir sayı çıkarmayın.
      Sen çıkarabilirsiniz 1gelen 5 ya 10 ama değil itibaren50, 100, 500...

Misal

Input:

Aa  
BAa  
CCCXLVII   
MMMCDVII  
ABADDF  
XVVX  
FAASGSH  
DXCCDA  
AaBbcDEf   

Output:

4 {a=5, A=1}  
14 {B=10, a=5, A=1}  
347 {C=100, L=50, X=10, V=5, I=1}  
347 {M=100, D=50, C=10, V=5, I=1}  
1921 {A=1000, B=100, D=10, F=1}  
'XVVX' failed Roman numeral test  
7191 {F=5000, A=1000, S=100, G=10, H=1}  
'DXCCDA' failed Roman numeral test
4444 {a=5000, A=1000, b=500, B=100, D=50, c=10, f=5, E=1}  

3
@IamOgbz bu harika bir soruya dönüştü, ancak yol boyunca yorumlarda birçok soru çekti. Artık yeterli itibara sahip olduğunuz için korumalı alanı öneriyorum . Göndermeden hemen önce soru almak için çok yararlı buluyorum.
trichoplax

CCCLXVII 347 vererek CCCXLVII olarak yorumlanmaz mı?
Skyler

@Skyler kesinlikle haklısın, şimdi güncellenecek! Teşekkürler.
iamogbz

Bireysel harflerin hangi değerlere sahip olabileceği konusunda herhangi bir kısıtlama görmüyorum (ve aslında 20'den bahsediyorsunuz, bu standart bir Roma rakamının değeri değil). Herhangi bir pozitif tamsayının bir Romen rakamıyla temsil edilebileceğini mi söylemek istiyorsun ? Bu durumda Aa1 değerine sahiptir (A = 1, a = 2).
msh210

@ msh210 harfleri yalnızca Romen Rakamları olarak yorumlayabildiğinden, münferit harf değerlerinin sadece 10 veya 5 kat 10'luk güçler olabileceği sonucuna varılır. 19 geçerli bir çıkarma değildir). Umarım bu sizin için temizler.
iamogbz

Yanıtlar:


1

Python 2, 415 444 440 419 416 bayt

Ne de olsa o kadar çok Roma rakamı yok. Bu komut dosyası hepsini oluşturur ve girdinin tüm permütasyonlarını kontrol eder, ardından en küçük eşleşmeyi döndürür.

a=raw_input()
g=range
b=list(set(a))+[' ']*9
from itertools import*
c=[]
s={}
u=1000
for i in g(10*u):
 t,f=(10*u,9*u,5*u,4*u,u,900,500,400,100,90,50,40,10,9,5,4,1),i;r=""
 for j in g(17):k=i/t[j];r+=('W MW Q MQ M CM D CD C XC L XL X IX V IV I').split()[j]*k;i-=t[j]*k
 s[r]=f
for i in permutations(b[:9]):
 r=''
 for j in a:r+='IVXLCMQWE'[i.index(j)]
 if r in s:c+=[s[r]]
print c and min(c)or'%s failed Roman numeral test'%a

Bu şu anda olduğu gibi meydan okumaya iyi bir cevap. Ancak erken silinen yorum sohbetinde, bu (gerçek olmayan) sistemin M = 1000'den sonra devam ettiği ve 5k, 10k ve benzeri sembollere sahip olduğu ima edildi. Üstteki ilk örneğe bakın: {A = 10, I = 1, X = 5, ... Z = 1000000} sizin yorumunuza karar verir
edc65

.. ve son örnek, a = 5000 ...
edc65

Verilen tüm test durumlarını işlemek için güncelledim. Bu yaklaşımın Roma rakamlarının sayısında O (n!) Zaman aldığı için 10.000'i aşabileceğinden şüpheliyim .
Skyler

@Skyler test senaryoları ayrıntılı değildir. Program, belirsiz durumlarda düşük sayılara tercih edilerek, romen rakam kurallarına göre yorumlanabilecek geçerli girdilerin tüm olası permütasyonlarını ele almalıdır. Ayrıca kodunuz son test senaryosunu işleyemedi bağlantısını
işleyemedi

değil import itertools as iDaha i.permutationskısa mi?
kedi
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.