সিফার্ড রোমান সংখ্যাগুলি আরবি দশমিকগুলিতে রূপান্তর করুন


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
@ আইআমওজিবিজ এটি একটি দুর্দান্ত প্রশ্নে রূপান্তরিত হয়েছে তবে মন্তব্যে প্রচুর প্রশ্ন আকর্ষণ করেছে along আপনার যথেষ্ট খ্যাতি আছে এখন, আমি স্যান্ডবক্স সুপারিশ । পোস্ট করার ঠিক আগেই প্রশ্ন পেতে আমি এটি খুব দরকারী বলে মনে করি।
ট্রাইকোপ্লাক্স

সিসিসিএলএক্সভিআইআই কে সিসিসিএক্সএলভিআইআই হিসাবে ব্যাখ্যা করা হবে না, 347 দিচ্ছে?
স্কাইলার

@ স্কিলার আপনি একদম ঠিক আছেন, এখনই আপডেট হবে! ধন্যবাদ।
iamogbz

স্বতন্ত্র অক্ষরগুলির কী মূল্য থাকতে পারে সে সম্পর্কে আমি কোনও বিধিনিষেধ দেখছি না (এবং প্রকৃতপক্ষে আপনি ২০ টি উল্লেখ করেছেন যা কোনও মানক রোমান সংখ্যার মান নয়)। আপনি কি বলতে চাইছেন যে কোনও ধনাত্মক পূর্ণসংখ্যাটি রোমান অঙ্ক দ্বারা প্রতিনিধিত্ব করা যায়? সেক্ষেত্রে, Aa1 একটি মান (একটি = 1, একটি = 2) আছে।
এমএস 210

@ msh210 বর্ণগুলি কেবল রোমান অঙ্ক হিসাবে ব্যাখ্যা করা যায়, এটি অনুসরণ করে যে পৃথক বর্ণের মানগুলি 10 এর 5 বা 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

এটি এখন যেমন চ্যালেঞ্জের একটি ভাল উত্তর। তবে তাড়াতাড়ি নিশ্চিহ্ন হয়ে যাওয়া মন্তব্য কথোপকথনে ইঙ্গিত দেওয়া হয়েছিল যে এই (বাস্তব নয়) সিস্টেম এম = 1000 এর পরে চলেছে, 5 কে, 10 কে এবং এর মতো চিহ্ন রয়েছে। শীর্ষে প্রথম উদাহরণটি দেখুন: {এ = 10, আই = 1, এক্স = 5, ... জেড = 1000000} আপনার ব্যাখ্যা দ্বারা সিদ্ধান্ত নেওয়া হয়েছে
edc65

.., এবং শেষ উদাহরণ, a = 5000 ...
edc65

প্রদত্ত সমস্ত পরীক্ষার কেস পরিচালনা করার জন্য আমি এটি আপডেট করেছি। আমি সন্দেহ করি যে এই পদ্ধতির 10,000 টিরও বেশি বাড়ানো যেতে পারে কারণ রোমান অঙ্কের সংখ্যার উপর ও (এন!) সময় লাগে ।
স্কাইলার 21

@ স্কিলার পরীক্ষার কেসগুলি সম্পূর্ণ নয়। অস্পষ্ট ক্ষেত্রে কম সংখ্যাকে প্রাধান্য দিয়ে প্রোগ্রামটি রোমান সংখ্যার নিয়ম অনুসারে ব্যাখ্যা করা যায় এমন বৈধ ইনপুটগুলির সমস্ত সম্ভাব্য ক্রিয়াকলাপ পরিচালনা করতে হবে। এছাড়াও আপনার কোডটি সর্বশেষ পরীক্ষার কেস লিঙ্কটি
iamogbz

নন import itertools as iএবং তারপর i.permutationsখাটো?
বিড়াল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.