परिवर्तित रोमन अंकों को अरबी दशमलव में परिवर्तित करें


16

रोमन अंक के रूप में अक्षरों के अनुक्रम की व्याख्या करने के लिए एक एल्गोरिथ्म लिखें। (नीचे रोमन अंक नियम देखें)

प्रत्येक अलग अक्षर में एक मिलान अरबी दशमलव मान होता है, अधिकतम नहीं। लेकिन आपके पास पहले से कुंजी नहीं है, इसलिए {A=10, I=1, X=5, ... Z=1000000}आपकी व्याख्या से तय किया जाता है।

चुनौती

  1. इनपुट के माध्यम से STDINया समतुल्य पढ़ें और इसके माध्यम से STDOUTया समकक्ष आउटपुट लिखें
  2. मान्य इनपुट अपरकेस और लोअरकेस अक्षरों के मेल यानी मेल खाते हैं \[a-zA-Z]+\
  3. इनपुट को यह देखने के लिए मान्य किया जाना चाहिए कि क्या पत्र अनुक्रम को मान्य रोमन अंक के रूप में व्याख्या किया जा सकता है
  4. यदि इनपुट सत्यापन पास करता है, तो मान्य आउटपुट सबसे कम अरबी दशमलव व्याख्या होनी चाहिए और उपयोग की जाने वाली कुंजी Aaकी व्याख्या की जाती 4 {a=5, A=1} है या नहीं6 {A=5, a=1} 9 {a=10, a=1}

रोमन अंक नियम

  1. केवल दस की शक्तियों का प्रतिनिधित्व करने वाले अक्षरों को दोहराया जा सकता है, क्रमिक रूप से अधिकतम तीन गुना और कुल उदाहरण में चार गुना II III XXXIX

  2. यदि एक या एक से अधिक अक्षर एक से अधिक मूल्य के अक्षर के बाद रखे जाते हैं, तो उस राशि को जोड़ दें

    AAaa   => 22 {A=10, a=1}          (20 + 2 = 22)  
    bbAAaa => 222 {b=100, A=10, a=1}  (200 + 20 + 2 = 222)   
    
  3. यदि कोई अक्षर अधिक मूल्य के दूसरे अक्षर से पहले रखा जाता है, तो उस राशि को घटाएं

    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)  
    

    रोमन अंकों से राशि घटाने के लिए कई नियम लागू होते हैं:

    • केवल दस की शक्ति घटाना अर्थात 1, 10, 100... नहीं 5, 50, 500...
    • कोई दोहरा घटाव इसलिए नहीं18 लिखा जाता XVIII है IIXX (10 + 10 - 1 - 1)
    • एक से एक संख्या को घटाएं नहीं जो दस गुना से अधिक हो।
      आप घटा सकते 1से 5 या 10 लेकिन नहीं से50, 100, 500...

उदाहरण

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 यह एक महान प्रश्न में बदल गया है लेकिन रास्ते में टिप्पणियों में बहुत सारे सवालों को आकर्षित किया है। अब जब आपके पास पर्याप्त प्रतिष्ठा है, तो मैं सैंडबॉक्स की सलाह देता हूं । मुझे पोस्ट करने से ठीक पहले प्रश्न प्राप्त करना बहुत उपयोगी लगता है।
ट्राइकोप्लाक्स

क्या CCCLXVII को 347 देते हुए CCCXLVII के रूप में व्याख्या नहीं की जाएगी?
स्किलेर

@Skyler आप बिल्कुल सही हैं, अब अपडेट करेंगे! धन्यवाद।
Iamogbz

मुझे इस बात पर कोई प्रतिबंध नहीं दिखता है कि व्यक्तिगत पत्रों में कौन से मूल्य हो सकते हैं (और वास्तव में आप 20 का उल्लेख करते हैं, जो एक मानक रोमन अंक का मूल्य नहीं है)। क्या आपके कहने का मतलब यह है कि रोमन अंक द्वारा किसी भी सकारात्मक पूर्णांक का प्रतिनिधित्व किया जा सकता है? उस स्थिति में, Aa1 (A = 1, a = 2) का मान है।
15:42 बजे msh210

@ msh210 को केवल रोमन अंकों के रूप में व्याख्या किया जा सकता है, यह इस प्रकार है कि व्यक्तिगत अक्षर मान केवल 10 या 5 गुना शक्तियों की शक्तियां हो सकती हैं। 20 केवल दो रोमन अंकों के संयोजन के संबंध में उल्लेख किया गया था (और तनाव के लिए कि IXX = 19 एक वैध घटाव नहीं है)। आशा है कि यह आप के लिए इसे साफ करता है।
Iamogbz

जवाबों:


1

पायथन 2, 415 444 440 419 416 बाइट्स

वहाँ सभी रोमन अंक नहीं हैं, सब के बाद। यह स्क्रिप्ट उन सभी को बनाता है और इनपुट के सभी क्रमपरिवर्तन की जाँच करता है, फिर सबसे छोटा मैच लौटाता है।

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

यह चुनौती का एक अच्छा जवाब है क्योंकि यह अब है। लेकिन टिप्पणी बातचीत में जिसे जल्दी मिटा दिया गया था, यह संकेत दिया गया था कि यह (वास्तविक नहीं) प्रणाली M = 1000 के बाद चलती है, जिसमें 5k, 10k और इसी तरह के प्रतीक हैं। शीर्ष पर पहला उदाहरण देखें: {A = 10, I = 1, X = 5, ... Z = 1000000} आपकी व्याख्या से तय होता है
edc65

.., और अंतिम उदाहरण, a = 5000 ...
edc65

मैंने इसे दिए गए सभी परीक्षण मामलों को संभालने के लिए अद्यतन किया। मुझे संदेह है कि रोमन दृष्टिकोणों की संख्या पर O (n!) समय लगने से इस दृष्टिकोण को 10,000 तक बढ़ाया जा सकता है ।
स्काइलर

@Skyler परीक्षण के मामले संपूर्ण नहीं हैं। कार्यक्रम को उन अस्पष्ट इनपुट के सभी संभावित क्रमांकन को संभालना चाहिए जिन्हें रोमन अंक नियमों के अनुसार व्याख्या किया जा सकता है, अस्पष्ट मामलों में कम संख्या को वरीयता दी गई है। इसके अलावा आपका कोड अंतिम परीक्षण केस लिंक को
iamogbz

नहीं है import itertools as iऔर फिर i.permutationsछोटा है?
बिल्ली 12
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.