रोमन अंक कनवर्टर समारोह


14

रोमन अंकों की एक स्ट्रिंग को पूर्णांक में बदलने के लिए सबसे छोटा फ़ंक्शन बनाएं ।

प्रत्येक पत्र के नियम विकिपीडिया पृष्ठ पर देखे जा सकते हैं । 1,000 से ऊपर के पत्रों में उनके उच्च मूल्य को इंगित करने के लिए उनके चारों ओर कोष्ठक होंगे।

आवश्यकताएँ:

  • रोमन अंकों को 1 से 500,000 में बदलना चाहिए
  • एक मिनट से भी कम समय में पूरा करना होगा
  • अंतर्निहित कार्यों का उपयोग नहीं करता है जो एक लाभ प्रदान कर सकता है (उदा: एक फ़ंक्शन जो रोमन अंकों को पूर्णांकों में परिवर्तित करता है)
  • एक फ़ंक्शन है

फ़ंक्शन को अंशों का समर्थन करने की आवश्यकता नहीं है। किसी भी अमान्य इनपुट को 0 नंबर वापस करना चाहिए।

सबसे छोटा फंक्शन जीतता है। एक टाई के मामले में, सबसे अधिक वोटों के साथ जीत होती है।

परीक्षण के मामलों

इनपुट

III

उत्पादन

3


इनपुट

IIII

उत्पादन

0


इनपुट

XVI

उत्पादन

16


इनपुट

(C)(D)(L)MMI

उत्पादन

452001

2
जब तक मैं कुछ याद कर रहा हूँ, (C)(D)(L)MMI452,001 होगा। आपको अपना मूल्य कैसे मिला? इसके अतिरिक्त, क्या इसे "अनुचित" रूपों (जैसे के ICबजाय XCIX) का समर्थन करने की आवश्यकता है ?
आनन।

मेरे लिए अनुचित का अर्थ है अवैध और इस तरह से वापस आना चाहिए
मार्टिन 19:

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

1
मानक इनपुट (और इस प्रश्न के डुप्लिकेट की कल्पना) अमान्य इनपुट के लिए अपरिभाषित व्यवहार है। चूँकि यह प्रश्न चार साल पुराना है और इसका केवल एक ही उत्तर था, क्या हमें आवश्यकताओं को बदलना चाहिए?
lirtosiast

1
@ केविनब्रोर्न मुझे कोष्ठक पत्रों के लिए स्रोत या स्पष्टीकरण नहीं दिखता है। मुझे लगता है कि आपको codegolf.stackexchange.com/q/16254/43319 से मिलान करने के लिए युक्ति बदलनी चाहिए और फिर वहां से जवाबों को माइग्रेट किया जा सकता है।
Adám

जवाबों:


6

C ++: 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'))
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.