রোমান সংখ্যা রূপান্তরকারী ফাংশন


14

রোমান সংখ্যার একটি স্ট্রিংকে পূর্ণসংখ্যায় রূপান্তর করতে সবচেয়ে সংক্ষিপ্ত ফাংশন তৈরি করুন ।

প্রতিটি অক্ষরের নিয়মগুলি উইকিপিডিয়া পৃষ্ঠায় পাওয়া যাবে । 1000 এর উপরে বর্ণগুলিতে তাদের উচ্চ মানের সংকেত দেওয়ার জন্য তাদের চারপাশে বন্ধনী স্থাপন করা হবে।

প্রয়োজনীয়তা:

  • রোমান সংখ্যাগুলি 1 থেকে 500,000 এ রূপান্তর করতে হবে
  • এক মিনিটেরও কম সময়ে শেষ করতে হবে
  • বিল্ট-ইন ফাংশনগুলি ব্যবহার করে না যা কোনও সুবিধা সরবরাহ করতে পারে (উদা: রোমান সংখ্যাগুলিকে পূর্ণসংখ্যায় রূপান্তর করে এমন একটি ফাংশন)
  • একটি ফাংশন

ফাংশনটির ভগ্নাংশকে সমর্থন করার প্রয়োজন নেই। কোনও অবৈধ ইনপুট ০ নম্বরটি ফিরিয়ে আনবে।

সংক্ষিপ্ততম ফাংশন জিতেছে। টাইয়ের ক্ষেত্রে সবচেয়ে বেশি ভোটের সাথে একটি জিতে যায়।

পরীক্ষার কেস

ইনপুট

III

আউটপুট

3


ইনপুট

IIII

আউটপুট

0


ইনপুট

XVI

আউটপুট

16


ইনপুট

(C)(D)(L)MMI

আউটপুট

452001

2
আমি যদি কিছু মিস করি না (C)(D)(L)MMIতবে 452,001 হয়ে যাবে। আপনি কিভাবে আপনার মান পেয়েছেন? অতিরিক্তভাবে, এর জন্য কি "অনুচিত" ফর্মগুলি সমর্থন করা দরকার (উদাহরণস্বরূপ ICপরিবর্তে XCIX)?
আনন

আমাকে অপ্রকৃত অবৈধ অর্থ এবং এইভাবে 0 ফিরে উচিত
মার্টিন ইয়র্ক

@ অ্যান: আমি আসল তৃতীয় পরীক্ষার কেসটি পরিবর্তন করার সময় থেকে এই নম্বরটি একটি ভুল টাইপ ছিল। এটি অনুপযুক্ত ফর্মগুলি সমর্থন করার প্রয়োজন নেই, কারণ এটি অবৈধ ইনপুট হিসাবে বিবেচিত হবে।
কেভিন ব্রাউন

1
স্ট্যান্ডার্ড অনুশীলন (এবং এই প্রশ্নের নকলের স্পেক) অবৈধ ইনপুটটির অপরিজ্ঞাত আচরণ হতে be যেহেতু এই প্রশ্নটি চার বছরের পুরানো এবং এর একটি মাত্র উত্তর ছিল, আমাদের কী প্রয়োজনীয়তাগুলি পরিবর্তন করা উচিত?
lirtosiast

1
@ কেভিনব্রাউন আমি প্রথম বন্ধনীগুলির জন্য উত্স বা ব্যাখ্যা দেখতে পাচ্ছি না। আমি মনে করি কোডগল্ফ.স্ট্যাকেক্সেঞ্জার.এইচ / 16254/43319 এর সাথে ম্যাচ করার জন্য আপনার চশমাটি পরিবর্তন করা উচিত এবং সেখান থেকে উত্তরগুলি এখানে স্থানান্তরিত হতে পারে।
অ্যাডম

উত্তর:


6

সি ++: 914 855 অক্ষর

#include<map>
#include<string>
#include<iostream>
#include<sstream>
#define I istream
#define T(C) if(C)throw int(1);
#define X(c,v,f,m) D[c]=v;P[c]=D[f];M[c]=m;
#define S second
using namespace std;typedef map<char,int>R;R D,P,M;struct U{U():t(0),l(0),a(0){}int t,l,a;operator int(){return t+l;}I&d(I&s){char c,b;s>>c;if(c=='('){s>>c>>b;T(b!=')')c+=32;}if(s){R::iterator f=D.find(c);T(f==D.end())if(P[c]==l){l=f->S-l;a=0;}else{T(l&&(f->S>l))a=l==f->S?a+1:1;T(a>M[c])t+=l;l=f->S;}}return s;}};I&operator>>(I&s,U&d){return d.d(s);}int main(){D[' ']=-1;X(73,1,32,3)X(86,5,73,1)X(88,10,73,3)X(76,50,88,1)X(67,100,88,3)X(68,500,67,1)X(77,1000,67,3)X(118,5000,77,1)X(120,10000,77,3)X(108,50000,120,1)X(99,100000,120,3)X(100,500000,99,1)X(109,1000000,99,3)string w;while(cin>>w){try{stringstream s(w);U c;while(s>>c);cout<<c<<"\n";}catch(int x){cout<<"0\n";}}}

এটি আরও সংকুচিত করা যেতে পারে।

> ./a.exe
III
3
IIII
0
XVI
16
(C)(D)(L)MMI
452001

সামান্য উত্তম ফরম্যাটিং: 1582 চর

#include<map>
#include<string>
#include<iostream>
#include<sstream>
#define I istream
#define T(C) if(C)throw int(1);
#define X(c,v,f,m) D[c]=v;P[c]=D[f];M[c]=m;
#define S second
using namespace std;

typedef map<char,int>      R;

R     D,P,M;

struct U
{
    U(): t(0), l(0), a(0) {}

    int  t,l,a;

    operator int()
    {
        return t + l;
    }
    I& d(I& s)
    {
        char c,b;
        s >> c;
        if (c == '(')
        {
            s >> c >> b;
            T(b != ')')
            c = tolower(c);
        }
        if (s)
        {
            R::iterator f = D.find(c);
            T(f == D.end())

            if (P[c] == l)
            {
                l = f->S - l;
                a = 0;
            }
            else
            {
                T(l&&(f->S > l))
                a=l==f->S?a+1:1;
                T(a>M[c])
                t   += l;
                l     = f->S;
            }
        }

        return s;
    }

};

I& operator>>(I& s,U& d)
{
    return d.d(s);
}

int main()
{
    D[' ']=-1;
    X(73,1,32,3)
    X(86,5,73,1)
    X(88,10,73,3)
    X(76,50,88,1)
    X(67,100,88,3)
    X(68,500,67,1)
    X(77,1000,67,3)
    X(118,5000,77,1)
    X(120,10000,77,3)
    X(108,50000,120,1)
    X(99,100000,120,3)
    X(100,500000,99,1)
    X(109,1000000,99,3)

    string w;
    while(cin >> w)
    {
        try
        {
            stringstream s(w);
            U    c;
            while(s >> c);
            cout << c << "\n";
        }
        catch(int x)
        {
            cout << "0\n";
        }
    }
}

আমি মনে করি না যে আপনাকে ম্যাক্রো ফাংশন এবং তাদের সংজ্ঞাগুলির মধ্যে একটি স্থান প্রয়োজন।
জাকারি

4

জাভাস্ক্রিপ্ট, 317 অক্ষর

function f(s){for(r=/\(?(.\)?)/g,t=e=0;a=r.exec(s);l=a[0].length,d='IXCMVLD'.indexOf(a[1][0]),e=e||d<0||l==2||d*4+l==3,t+='+'+(d>3?5:1)*Math.pow(10,d%4+3*(l>1)));t=t&&t.replace(/1(0*).(10|5)\1(?!0)/g,'$2$1-1$1');return e||/[^0](0*)\+(10|5)\1/.test(t)||/(\+10*)\1{3}(?!-)/.test(t)||/-(10*)\+\1(?!-)/.test(t)?0:eval(t)}

Explaination:

function f(s){
      // iterate over every character grabbing parens along the way
  for(r=/\(?(.\)?)/g,t=e=0;a=r.exec(s);    
        // get a numerical value for each numeral and join together in a string
    l=a[0].length,
    d='IXCMVLD'.indexOf(a[1][0]),
    e=e||d<0||l==2||d*4+l==3,    // find invalid characters, and parens
    t+='+'+(d>3?5:1)*Math.pow(10,d%4+3*(l>1))
  );
      // reorder and subtract to fix IV, IX and the like
  t=t&&t.replace(/1(0*).(10|5)\1(?!0)/g,'$2$1-1$1');
  return e||
    /[^0](0*)\+(10|5)\1/.test(t)|| // find VV,IIV,IC,...
    /(\+10*)\1{3}(?!-)/.test(t)||  // find IIII,... but not XXXIX
    /-(10*)\+\1(?!-)/.test(t)      // find IVI,... but not XCIX
      ?0:eval(t)
}

ত্রুটি সনাক্তকরণ ছাড়াই এটি কেবল 180 টি অক্ষর

function g(s){for(r=/\(?(.\)?)/g,t=0;a=r.exec(s);d='IXCMVLD'.indexOf(a[1][0]),t+='+'+(d>3?5:1)+'0'.repeat(d%4+3*(a[1].length>1)));return eval(t.replace(/(1(0*).(10|5)\2)/g,'-$1'))}

এটি একইভাবে কাজ করে তবে এখানে আরও ভাল ফর্ম্যাটিং রয়েছে:

function g(s){
  for(r=/\(?(.\)?)/g,t=0;a=r.exec(s);
    d='IXCMVLD'.indexOf(a[1][0]),
    t+='+'+(d>3?5:1)+'0'.repeat(d%4+3*(a[1].length>1))
  );
  return eval(t.replace(/(1(0*).(10|5)\2)/g,'-$1'))
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.