একটি রোমান অঙ্কের ক্যালকুলেটর তৈরি করুন


18

রোমান সংখ্যার জন্য একটি বেসিক ক্যালকুলেটর তৈরি করুন।

আবশ্যকতা

  • সমর্থন +, -, *,/
  • ইনপুট এবং আউটপুট প্রতীক হিসাবে কেবল একটি সাবট্রেক্টর উপসর্গ আশা করা উচিত (অর্থাত 3 হতে পারে না) IIV কারণ Iআগে দুটি আছে V)
  • ন্যূনতম সমর্থন আধুনিক মান সম্মেলনগুলোতে ইনপুট এবং আউটপুট আবশ্যক মধ্যে বিয়োগ নীতি, যা দশ একমাত্র ক্ষমতা বৃহত্তর সংখ্যার থেকে বিয়োগ করা হয় (যেমন সামলাচ্ছে I, X, Cপ্রয়োজন হয় subtractors কিন্তু V, L, D) এবং বিয়োগ বেশি সময় নম্বর থেকে কখনোই সম্পন্ন করা হয় 10x বিয়োগকারক (উদাঃ)IX সমর্থিত হওয়া ICপ্রয়োজন তবে প্রয়োজন নেই)।
  • ইনপুট এবং আউটপুট মান অনুসারে বাম থেকে ডান হওয়া উচিত, বৃহত্তম দিয়ে শুরু (অর্থাত্ 19 = XIXনয় IXX, 10 9 টির চেয়ে বড়)
  • বাম থেকে ডানদিকে কোনও অপারেটরের অগ্রাধিকার নেই, যেন আপনি কোনও হ্যান্ড ক্যালকুলেটর ব্যবহার করছেন।
  • 1-4999 এর মধ্যে পুরো ইতিবাচক সংখ্যা ইনপুট / আউটপুট সমর্থন করে (V̅ এর প্রয়োজন নেই)
  • আপনার জন্য রোমান সংখ্যা রূপান্তরকারী কোনও লাইব্রেরি নেই

আপনার সিদ্ধান্ত নেওয়ার জন্য

  • কেস সংবেদনশীলতা
  • ইনপুটটিতে ফাঁকা স্থান বা কোনও স্থান নেই
  • দশমিক আউটপুট পেলে কি হয়। কাটা, কোন উত্তর, ত্রুটি, ইত্যাদি।
  • আউটপুট জন্য কী করতে হবে যা আপনি পরিচালনা করতে পারবেন না। Largeণাত্মক বা সংখ্যাগুলি বড় হতে মুদ্রণ করতে হবে।
  • ন্যূনতম প্রয়োজনের চেয়ে বিয়োগ নীতিটির আরও উদার ব্যবহারকে সমর্থন করবেন কিনা।

অতিরিক্ত ক্রেডিট

  • -50 - 99999 বা আরও বড় পর্যন্ত পরিচালনা করুন le প্রতীকগুলি অবশ্যই একটি ভিনকুলাম অন্তর্ভুক্ত করতে হবে

নমুনা ইনপুট / আউটপুট

XIX + LXXX                 (19+80)
XCIX

XCIX + I / L * D + IV      (99+1/50*500+4)
MIV

সংক্ষিপ্ততম কোডটি জয়ী।


(99 + 1/50 * 500 + 4) = (99 + 10 + 4) = 113, তবে আপনার নমুনা ইনপুট / আউটপুট বলে এটি এমআইভি (1004)।
ভিক্টর স্টাফুসা

1
@ ভিক্টর - ডান দিকের কড়াকড়ি থেকে কড়া - কোনও নজির নিয়ম নেই - সুতরাং 99 + 1/50 * 500 + 4 গণনা করা উচিত (((99 + 1) / 50) * 500) + 4)

নম্বরগুলি হ্যান্ডলিং করা কি IM = 999প্রয়োজনীয়?
কেন্ডাল ফ্রে

@ KendallFrey আমি আশা করি আপনি ইনপুট করতে পারতেন IM। কিনা আউটপুট IMবা CMXCIX999 জন্য আপনাকে আপ হয়। উভয় প্রয়োজনীয়তা মাপসই।
ড্যানি

2
আধুনিক রোমান সংখ্যার ব্যবহারের জন্য আইএম মানহীন। সাধারণত এটি বিয়োগের দ্বারা সম্পন্ন প্রতিটি ক্রমের মাত্রার (4, 9, 40, 90, 400, 900, ইত্যাদি) কেবল 4s এবং 9s হয়। 1999 এর জন্য, এমসিএমএক্সএক্সআইএক্সটি এমআইএম নয়, ক্যানোনিকাল হবে ... সেই বছর থেকে কোনও চলচ্চিত্রের ক্রেডিট দেখুন। নাহলে শেষ কোথায়? আমরা কি 45 এর জন্য ভিএল এর মতো অন্যান্য অ-মানক বিয়োগগুলি সমর্থন করার আশা করি? সি-এর উপর ভিনকুলামযুক্ত আইসি বোনাসের জন্য 99999 হিসাবে সমর্থন করবে?
জোনাথন ভ্যান মাত্রে

উত্তর:


9

জাভাস্ক্রিপ্ট (ES6), 238

c=s=>{X={M:1e3,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1}
n=eval('W='+s.replace(/[\w]+/g,n=>(o=0,n.replace(/[MDLV]|C[MD]?|X[CL]?|I[XV]?/g,d=>o+=X[d]),
o+';W=W')));o='';for(i in X)while(n>=X[i])o+=i,n-=X[i];return o}

ব্যবহার:

c("XIX + LXXX")
> "XCIX"
c('XCIX + I / L * D + IV')
> "MIV"

টীকাগুলি সংস্করণ:

/**
 * Process basic calculation for roman numerals.
 * 
 * @param {String} s The calculation to perform
 * @return {String} The result in roman numerals
 */
c = s => {
  // Create a lookup table.
  X = {
    M: 1e3, CM: 900, D: 500, CD: 400, C: 100, XC: 90, 
    L: 50,  XL: 40,  X: 10,  IX: 9,   V: 5,   IV: 4, I: 1
  };
  // Do the calculation.
  // 
  // The evaluated string is instrumented to as below:
  //   99+1/50*500+4 -> W=99;W=W+1;W=W/50;W=W*500;W=W+4;W=W
  //                 -> 1004
  n = eval('W=' + s.replace(
    // Match all roman numerals.
    /[\w]+/g,
    // Convert the roman number into an integer.
    n => (
      o = 0,
      n.replace(
        /[MDLV]|C[MD]?|X[CL]?|I[XV]?/g,
        d => o += X[d]
      ),
      // Instrument number to operate left-side operations.
      o + ';W=W'
    )
  ));

  // Convert the result into roman numerals.
  o = '';
  for (i in X)
    while (n >= X[i])
      o += i,
      n -= X[i];

  // Return calculation result.
  return o
}

9

টি-এসকিউএল, 1974 - 50 = 1924 বাইট

আমি জানি যে এসকিউএল-এ গল্ফ করা বালি বেদী ছাড়া আর কিছুই না করে 18 টি গর্ত খেলার সমতুল্য, তবে আমি এইটির চ্যালেঞ্জকে সরিয়ে দিয়েছি এবং আমি মনে করি যে আমি পদ্ধতিগতভাবে কয়েকটি আকর্ষণীয় কাজ করতে পেরেছি।

এটি ইনপুট এবং আউটপুট উভয়ের জন্য ভিনকুলামকে সমর্থন করে। আমি এটি উপস্থাপনের জন্য ট্রিলিং টিলড ব্যবহারের কনভেনশন গ্রহণ করেছি, সুতরাং ভি 5000 5000, এক্স 100 10000 ইত্যাদি etc. এটি স্ট্যান্ডার্ড আধুনিক রোমান অঙ্কের ব্যবহার অনুসারে 399,999 অবধি আউটপুটগুলিও পরিচালনা করতে হবে। এর পরে, এটি আইএনটির সমর্থিত পরিসীমাটিতে যে কোনও কিছুর আংশিক অ-মানক রোমান এনকোডিং করবে।

কারণ এটি সমস্ত সংখ্যার গণিত, কোনও অ-পূর্ণসংখ্যার ফলাফলগুলি স্পষ্টতই বৃত্তাকারে হয়।

DECLARE @i VARCHAR(MAX)
SET @i='I+V*IV+IX*MXLVII+X~C~DCCVI'
SELECT @i

DECLARE @t TABLE(i INT IDENTITY,n VARCHAR(4),v INT)
DECLARE @u TABLE(n VARCHAR(50),v INT)
DECLARE @o TABLE(n INT IDENTITY,v CHAR(1))
DECLARE @r TABLE(n INT IDENTITY,v INT,r VARCHAR(MAX))
DECLARE @s TABLE(v INT,s VARCHAR(MAX))
DECLARE @p INT,@x VARCHAR(4000)='SELECT ',@j INT=1,@m INT,@y INT,@z VARCHAR(2),@q VARCHAR(50)='+-/*~]%'
INSERT @t(n,v) VALUES('i',1),('iv',4),('v',5),('ix',9),('x',10),('xl',50),('l',50),('xc',90),('c',100),('cd',400),('d',500),('cm',900),('m',1000),('mv~',4000),('v~',5000),('mx~',9000),('x~',10000),('x~l~',40000),('l~',50000),('x~c~',90000),('c~',100000)
INSERT @u VALUES('%i[^i'+@q,-2),('%v[^vi'+@q,-10),('%x[^xvi'+@q,-20),('%l[^lxvi'+@q,-100),('%c[^clxvi'+@q,-200),('%d[^dclxvi'+@q,-1000),('%mx~%',-2010),('%x~l~%',-20060),('%x~c~%',-20110)
WHILE PATINDEX('%[+-/*]%', @i)!=0
BEGIN
    SET @p=PATINDEX('%[+-/*]%', @i)
    INSERT @o(v) SELECT SUBSTRING(@i,@p,1)
    INSERT @r(r) SELECT SUBSTRING(@i,1,@p-1)
    SET @i=STUFF(@i,1,@p,'')
END 
INSERT @r(r) SELECT @i
UPDATE r SET v=COALESCE(q.v,0) FROM @r r LEFT JOIN (SELECT r.r,SUM(u.v)v FROM @u u JOIN @r r ON r.r LIKE u.n GROUP BY r.r)q ON q.r=r.r
UPDATE r SET v=r.v+q.v FROM @r r JOIN (SELECT r.n,r.r,SUM((LEN(r.r)-LEN(REPLACE(r.r,t.n,REPLICATE(' ',LEN(t.n)-1))))*t.v) v FROM @r r JOIN @t t ON CHARINDEX(t.n,r.r) != 0 AND (LEN(t.n)=1 OR (LEN(t.n)=2 AND RIGHT(t.n,1)='~')) GROUP BY r.n,r.r) q ON q.r=r.r AND q.n = r.n
SELECT @m=MAX(n) FROM @o
SELECT @x=@x+REPLICATE('(',@m)+CAST(v AS VARCHAR) FROM @r WHERE n=1
WHILE @j<=@m
BEGIN
    SELECT @x=@x+o.v+CAST(r.v AS VARCHAR)+')'
    FROM @o o JOIN @r r ON r.n=o.n+1 WHERE o.n=@j
    SET @j=@j+1
END 
INSERT @s(v,s) EXEC(@x+',''''')
UPDATE @s SET s=s+CAST(v AS VARCHAR(MAX))+' = '
SET @j=21
WHILE @j>0
BEGIN
    SELECT @y=v,@z=n FROM @t WHERE i = @j
    WHILE @y<=(SELECT v FROM @s)
    BEGIN
        UPDATE @s SET v=v-@y,s=s+@z
    END  
    SET @j=@j-1
END
SELECT @x+' = '+UPPER(s) FROM @s

আমি এখনও WHIP লুপিংয়ের কিছু প্রতিস্থাপনের জন্য একটি সেট-ভিত্তিক সমাধানের সাথে ঝাঁকুনি দিচ্ছি যা বাইট গণনাটি হিট করতে পারে এবং idiomatic SQL এর আরও মার্জিত উদাহরণ হতে পারে। টেবিল এলিয়াসের ব্যবহার কম করে সর্বনিম্ন হ্রাস করে কিছু বাইটও অর্জন করতে হবে। তবে এটি মূলত এই ভাষায় বিজয়ী না হওয়ায় আমার ডন কুইক্সোটের পোশাকটি প্রদর্শন করতে আমি বেশিরভাগই এখানে আছি। :)

শীর্ষে @i নির্বাচন করুন ইনপুটটি পুনরাবৃত্তি করে:

I+V*IV+IX*MXLVII+X~C~DCCVI

এবং নির্বাচন শেষে ফিরে আসে:

SELECT (((((1+5)*4)+9)*1047)+90706) = 125257 = C~X~X~V~CCLVII

এবং আপনি নিজেই এই এসকিউএলফিডেলে এটি পরীক্ষা করতে পারেন

এবং আমি এটি কীভাবে কাজ করে তাতে কিছু মন্তব্য যুক্ত করতে ফিরে যাব, কেননা আপনি যদি শিক্ষাগত মূল্যবোধের জন্য এটি ব্যবহার না করে থাকেন তবে কেন স্পষ্টতই উত্তরটি পোস্ট করবেন?


2

জাভাস্ক্রিপ্ট - 482 476 টি অক্ষর

String.prototype.m=String.prototype.replace;eval("function r(a){return a>999?'Mk1e3j899?'CMk900j499?'Dk500j399?'CDk400j99?'Ck100j89?'XCk90j49?'Lk50j39?'XLk40j9?'Xk10j8?'IX':a>4?'Vk5j3?'IV':a>0?'Ik1):''}".m(/k/g,"'+r(a-").m(/j/g,"):a>"));s=prompt();h=s.match(/\w+/gi);for(k in h)s=s.m(h[k],eval(eval("'0'+h[k].m(/IVu4pIXu9pXLu40pXCu90pCDu400pCMu900pMu1000pDu500pCu100pLu50pXu10pVu5pIu1')".m(/u/g,"/g,'+").m(/p/g,"').m(/")))+")");for(k in h)s="("+s;alert(r(Math.floor(eval(s))))

নমুনা ইনপুট / আউটপুট কাজ করে:

XIX + LXXX -> XCIX
XCIX + I / L * D + IV -> MIV

এটি বিপুল সংখ্যককেও খারাপভাবে পরিচালনা করে:

MMM+MMM -> MMMMMM
M*C -> MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

এবং এটি গ্রহণ করে, তবে স্পেসও খুব বেশি লাগে না।

তবে, যেহেতু আমি গল্ফ করছিলাম তখন এটিতে কিছু সমস্যা রয়েছে:

  • ইনপুটটি সুগঠিত থাকলে এটি বৈধ হয় না। যদি ইনপুটটি সুগঠিত না হয়, তবে আচরণটি সংজ্ঞায়িত হয় (এবং বাস্তবে এটি খুব উদ্ভট এবং অদ্ভুত)।
  • এটি আউটপুটে ভগ্নাংশের সংখ্যা কেটে দেয় (তবে এটি তাদের সাথে মধ্যবর্তী গণনা করতে সক্ষম)।
  • এটি সত্যিই alভাল ফাংশনটি অপব্যবহার করে।
  • এটি নেতিবাচক সংখ্যাগুলি হ্যান্ডেল করার চেষ্টা করে না।
  • এটি কেস-সংবেদনশীল।

এই বিকল্প সংস্করণটি 99999 অবধি 5000 টিরও বেশি সংখ্যা পরিচালনা করে তবে এতে 600 598 584 টি অক্ষর রয়েছে:

String.prototype.m=String.prototype.replace;eval("function r(a){return a>8zz?'XqCqk9e4j4zz?'Lqk5e4j3zz?'XqLqk4e4jzz?'Xqk1e4j89z?'IqXqk9e3j49z?'Vqk5e3j9z?'Mk1e3j8z?'CMk900j4z?'Dk500j3z?'CDk400jz?'Ck100j89?'XCk90j49?'Lk50j39?'XLk40j9?'Xk10j8?'IX':a>4?'Vk5j3?'IV':a>0?'Ik1):''}".m(/k/g,"'+r(a-").m(/j/g,"):a>").m(/q/g,"\u0305").m(/z/g,"99"));s=prompt();h=s.match(/\w+/gi);for(k in h)s=s.m(h[k],eval(eval("'0'+h[k].m(/IVu4pIXu9pXLu40pXCu90pCDu400pCMu900pMu1000pDu500pCu100pLu50pXu10pVu5pIu1')".m(/u/g,"/g,'+").m(/p/g,"').m(/")))+")");for(k in h)s="("+s;console.log(r(Math.floor(eval(s))))

আমি মনে করি না -20 প্রযোজ্য: দেখুন vinculum
SeanC

এখানে @ সানচিশায়ারের সাথে সম্মত হন। বৃহত্তর সংখ্যার পরিচালনা করার উদ্দেশ্যে উদ্দেশ্যটি হল সংখ্যাটির উপরে একটি ভিনকুলাম যুক্ত করা যা এটি সাধারণত যা হয় তার চেয়ে 1000 গুণ বেশি। হতে পারে এটি একটি -২০ এর চেয়ে বড় হওয়া উচিত যাতে এটি এটি মানুষের জন্য চেষ্টা করার মতো করে তোলে।
ড্যানি

1
@ ড্যানি আমি একটি সংস্করণ যুক্ত করেছি যা ভিনকুলাস পরিচালনা করে তবে এটি কোডটি 116 টি অক্ষরে বৃদ্ধি করে।
ভিক্টর স্টাফুসা

2

জাভাস্ক্রিপ্ট 479 361 348 278 253

303 টি অক্ষর - 10 মিলিয়ন পর্যন্ত সংখ্যা সমর্থন করার জন্য 50, ভিনকুলাম সমর্থন সহ সম্পূর্ণ:

function p(s){s=s[r](/(^|[*\/+-])/g,"0;s$1=");for(i in v){f=R("\\b"+i);while(f.test(s))s=s[r](f,v[i]+"+")}eval(s+"0");h="";for(i in v)while(s>=v[i]){h+=i;s-=v[i]}return h}v={M̅:1e6,D̅:5e5,C̅:1e5,L̅:5e4,X̅:1e4,V̅:5e3,M:1e3,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1};r="replace";R=RegExp

ব্যবহার: p(text), যেমন, p('XIX + LXXX')আয় XCIX

ব্যাখ্যামূলক মন্তব্য সহ কোড:

// Array mapping characters to values
v={M¯:1e6,D¯:5e5,C¯:1e5,L¯:5e4,X¯:1e4,V¯:5e3,M:1e3,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1};
// Shortcut for String.replace
r='replace';
R=RegExp;

// The heart of the program
function p(s) {
    // Replace operators with ";s+=", ";s-=", and so on
    s=s[r](/(^|[*\/+-])/g,'0;s$1=');
    // Loop over the character map and replace all letters with numbers
    for(i in v){
        f=R('\\b'+i);
        while(f.test(s))
            s=s[r](f, v[i]+'+')
    }
    eval(s+'0');
    // Set up our return string
    h='';
    // Replace digits with characters
    for(i in v)
        while(s>=v[i]) {
            h+=i;
            s-=v[i];
        }
    return h;
}

এটি প্রদত্ত নমুনাগুলির জন্য এবং আমি চেষ্টা করেছি এমন অন্য সকলের জন্য কাজ করে। উদাহরণ:

XIX + LXXX = XCIX
XCIX + I / L * D + IV = MIV
XL + IX/VII + II * XIX = CLXXI
CD + C + XL + X + I = DLI
M̅ + I = M̅I
MMMM + M = V̅

2

রুবি 2.1, 353 (এবং অন্যান্য অনেকগুলি পুনরাবৃত্তি) , 295 - 50 = 245

ভিনকুলাম হ্যান্ডলিংয়ে 23 ডলার যুক্ত হয়।

এটি ইনপুটটিতে "আইএল" বা "ভিএম" পরিচালনা করে এবং negativeণাত্মক (উচ্চতর ইনটগুলিতে যায়) বা দশমিক (ছাঁটাই) বা কোনও স্পেসে ত্রুটি ছাড়াই ব্যর্থ হয়। এখন একটি নেতিবাচক প্রথম সংখ্যাটিও পরিচালনা করে (যদিও মোটটি নেতিবাচক হয় তবে এটি এখনও খারাপভাবে ব্যর্থ হয়)। আপনি * বা / অথবা যদি ফলাফলটি 4 মিলিয়ন বা তার চেয়ে বড় হয় শুরু করেন তবে খারাপভাবে ব্যর্থ হয়।

"হ্যান্ড-ক্যালকুলেটর" কার্যকারিতার জন্য অবজেক্ট # প্রেরণ ব্যবহার করে।

m=%w{I V X L C D M V̅ X̅ L̅ C̅ D̅ M̅};n=m.zip((0..12).map{|v|(v%2*4+1)*10**(v/2)}).to_h
d=0
gets.scan(/([-+*\/])?([A-Z̅]+)/){|o,l|f=t=0
l.scan(/.̅?/){t-=2*f if f<v=n[$&]
t+=f=v}
d=d.send o||:+,t}
7.downto(1){|v|z=10**v
y=(d%z)*10/z
q,w,e=m[v*2-2,3]
$><<(y>8?q+e : y<4?q*y : y<5?q+w : w+q*(y-5))}

Ungolfed:

m=%w{I V X L C D M V̅ X̅ L̅ C̅ D̅ M̅} # roman numerals
n=m.zip((0..12).map{|v|(v%2*4+1)*10**(v/2)}).to_h # map symbols to values
d=0
gets. # get input and...
  scan(/([-+*\/])?([A-Z̅]+)/) { |l,o|  # for each optional operator plus number
    f=t=0
    l.scan(/.̅?/){                           # read the number in one letter at a time
      t -= 2 * f if f < (v=n[$&])           # if the number's greater than the prev, subtract the prev twice since you already added it
      t += (f = v)                          # add this, and set prev to this number
    }
    d = d.send((o || :+), t)                # now that we've built our number, "o" it to the running total (default to +)
}
7.upto(1) { |v|                        # We now print the output string from left to right
  z = 10**v                            # z = [10, 100, 1000, etc.]
  y = (d%z)*10/z                       # if d is 167 and z is 100, y = 67/10 = 6 
  q,w,e = m[v*2-2,3]                   # q,w,e = X, L, C
  $><< (                               # print: 
    y>8 ? q+e :                        # if y==9,    XC
      y<4 ? q*y :                      # if y<4,     X*y
        y>3 ? q+w :                    # if y==4,    XL
          q*(y-5)                      # else,       L + X*(y-5)
  )
}

2

পাইথন 2 - 427 418 404 401 396 395 392 টি অক্ষর

স্ট্যান্ডার্ড ইনপুট থেকে পড়া। এটি কেবলমাত্র বড় হাতের পরিচালনা করে (এটি অতিরিক্ত অতিরিক্ত 8 টিরও বেশি দামের ক্ষেত্রে কেস-সংবেদনশীল করে তুলতে পারে) এবং এর জন্য ফাঁকা স্থান প্রয়োজন। কোনও বৈধতা নেই - এটি বিভিন্ন ক্ষেত্রে এটি কীভাবে ভেঙে যায় তা পরীক্ষা করে দেখিনি n't এটি ভিসি = 95 এর মতো সংখ্যাগুলি পরিচালনা করে।

N=['?M','DC','LX','VI'];t=0;o='+'
for q in raw_input().split():
 if q in"+-*/":o=q;continue
 n=s=0;X=1
 for l in q:
  x=''.join(N).find(l);v=(5-x%2*4)*10**(3-x/2)
  if X<x:n+=s;s=v;X=x
  elif X>x:n+=v-s;s=0
  else:n+=v+s;s=0
 exec"t"+o+"=n+s"
r=t/1000*'M'
for p,d in enumerate("%04d"%(t%1e3)):
 i="49".find(d);g=N[p]
 if i<0:
  if'4'<d:r+=g[0]
  r+=int(d)%5*g[1]
 else:r+=g[1]+N[p-i][i]
print r

এবং অবারিত সংস্করণ:

# Numerals grouped by powers of 10
N = ['?M','DC','LX','VI']
# Start with zero plus whatever the first number is
t = 0
o = '+'
for q in raw_input().split():
    if q in "+-*/":
        # An operator; store it and skip to the next entry
        o = q
        continue
    # n holds the converted Roman numeral, s is a temp storage variable
    n = s = 0
    # X stores our current index moving left-to-right in the string '?MDCLXVI'
    X = 1
    for l in q:
        # x is the index of the current letter in '?MDCLXVI'
        x = ''.join(N).find(l)
        # Calculate the value of this letter based on x
        v = (5 - x%2 * 4) * 10 ** (3 - x/2)
        if X < x:
            # We're moving forward in the list, e.g. CX
            n += s      # Add in any previously-stored value
            s = v       # Store this value in case we have something like CXL
            X = x       # Advance the index
        elif X > x:
            # Moving backward, e.g. XC
            n += v - s  # Add the current value and subtract the stored one
            s=0
        else:
            # Same index as before, e.g. XX
            n += v + s  # Add the current value and any stored one
            s = 0
    # Update total using operator and value (including leftover stored value
    # if any)
    exec "t" + o + "=n+s"

# Now convert the answer back to Roman numerals
# Special-case the thousands digit
r = t / 1000 * 'M'
# Loop over the number mod 1000, padded with zeroes to four digits (to make
# the indices come out right)
for p, d in enumerate("%04d" % (t % 1e3)):
    i = "49".find(d)
    g = N[p]
    if i < 0:
        # i == -1, thus d isn't '4' or '9'
        if '4' < d:
            # >= 5, so add the 5's letter
            r += g[0]
        # ... plus (digit % 5) copies of the 1's letter
        r += int(d) % 5 * g[1]
    else:
        # If it's a 4 or 9, add the 1's letter plus the appropriate
        # larger-valued letter
        r += g[1] + N[p-i][i]
print r

আমার একটা অনুভূতি আছে পার্ল আরও ভাল হতে পারত তবে আমি এটার যথেষ্ট জানি না। কোড গল্ফের প্রথম ছুরিকাঘাতের জন্য, যদিও আমি এই সম্পর্কে বেশ ভাল অনুভব করি।


1

পিএইচপি - 549 525 524 520 বাইট

খুব নতুন কিছু নয়: অপারেটরদের বাম থেকে ডান অগ্রাধিকার নিশ্চিত করার জন্য, রোমানকে দশমিক রূপান্তরিত evalকরে, বিবৃতিতে চালিত হয়, যেমন এক্সসিআইএক্স + আই / এল * ডি + আইভিকে রিটার্নের মতো কিছুতে রূপান্তরিত করা হয় ((((+90 +9)) + (+1)) / (+50)) * (+500)) + (+4)); , তারপরে দশমিককে আবার রোমে রূপান্তরিত করে।

  • চূড়ান্ত ফলাফল কাটা হয়
  • 1 টিরও কম উত্তর ফাঁকা ফিরে আসে
  • ভুল ইনপুট দেওয়া হলে ফলাফলগুলি অপরিজ্ঞাত হয়
$f='str_replace';$g='str_split';$c=array('M'=>1e3,'CM'=>900,'D'=>500,'CD'=>400,'C'=>100,'XC'=>90,'L'=>50,'XL'=>40,'X'=>10,'IX'=>9,'V'=>5,'IV'=>4,'I'=>1);$j='['.$f(array('+','-','*','/'),array('])+[','])-[','])*[','])/['), $argv[1]).'])';$j=str_repeat('(',substr_count($j,')')).$j;$j=$f('[','(',$j);$j=$f(']',')',$j);foreach($g('IVIXXLXCCDCM',2)as$w)$j=$f($w,'+'.$c[$w],$j);foreach($g('IVXLCDM')as$w)$j=$f($w,'+'.$c[$w],$j);$k=eval('return '.$j.';');$l='';foreach($c as$a=>$b){while($k>=$b){$l.=$a;$k-=$b;}}print$l."\n";

যেমন

$ php roman.php 'XCIX + I / L * D + IV' — test case
MIV                                     — 1004

$ php roman.php 'XXXII * LIX'           — 32 × 59
MDCCCLXXXVIII                           — 1888

0

পাইথন - 446 বাইট

এটি যথেষ্ট উন্নত হতে পারে। আমি অনুভব করেছি পাইথন ব্যবহার করে আমাকে প্রথম দোল নিতে হবে। এটি প্রথম পাসে 3 টি জিনিস করে

  1. সংখ্যা এবং অপারেটর টোকেনাইজ করে
  2. সংখ্যাগুলি মূল্যায়ন করে, এবং xসমস্ত সম্ভাব্য সংমিশ্রণগুলি সংযুক্ত করতে (তারা ব্যবহার না করা হলেও) প্রতীক টেবিলটি বাড়িয়ে তোলে en উদাহরণস্বরূপ, XIXলেক্স করার সময়, এর আংশিক মানগুলি "X":10, "XI":11এবং "XIX":19প্রতীক টেবিলটিতে যুক্ত করা হয়
  3. বাম থেকে ডান মূল্যায়ন কার্যকর করতে নেস্টেড পেরেনগুলি সন্নিবেশ করান

শেষে, এটি evalআসল স্ট্রিংটিতে (যুক্ত প্যারেন্স ব্যতীত) কল করে এবং এটি প্রতীক টেবিল দেয়।

এরপরে আমি কেবল পূর্ণসংখ্যাকে রোমান রূপান্তর করার জন্য একটি সলিউশন সমাধানে পেস্ট করেছি, যেহেতু আমি এই দীর্ঘ সময় ধরে কাজ করেছি ... দয়া করে উন্নতি করতে দ্বিধা বোধ করুন যাতে আমি নতুন কিছু শিখি :)

মি = zip ((1000,900,500,400,100,90,50,40,10,9,5,4,1),
( 'এম', 'মুখ্যমন্ত্রী', 'ডি', 'সিডি', 'সি', 'XC', 'এল', 'এক্সট্রা লার্জ', 'এক্স', 'নবম', 'ভি', 'চতুর্থ', ' আমি '))
Def doit (গুলি):
 এক্স = { 'এম': 1e3, 'ডি': 500, 'সি': 100, 'এল': 50, 'X: 10,' ভী ': 5,' আমি ': 1}; Y = [] ; z- র = ''; একটি = '0'; র = + + S
 সি এর জন্য সিপার ():
  যদি x তে সি:
   Z + = C; y.append (এক্স [গ])
   যদি লেন (y)> 1 ও y [-1]> y [-2]: y [-2] * = - 1
   এক্স [Z] = SUM (Y)
  "+ / * -" এ এলিফ সি: এ = '(' + এ + জেড + ')' + সি; ওয়াই = []; জেড = ''
 a + = z; i = eval (a, x); r = ''
 এন, সি-তে এম: ডি = ইন (আই / এন); আর + = সি * ডি; আই- = এন * ডি
 রিটার্ন


প্রিন্ট ডোয়েট ("এক্সআইএক্স + এলএক্সএক্সএক্স")
প্রিন্ট ডোয়েট ("এক্সসিআইএক্স + আই / এল * ডি + আইভি")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.