C++: 914 855 chars
#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";}}}
It could be compressed further.
> ./a.exe
III
3
IIII
0
XVI
16
(C)(D)(L)MMI
452001
Slightly nicer formatting: 1582 char
#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";
}
}
}
1Standard practice (and the spec of this question's duplicate) is for invalid input to be undefined behavior. Since this question is four years old and had only one answer, should we change the requirements? – lirtosiast – 2015-06-04T23:38:39.830
@ThomasKwa I'm strongly considering it. Though I might as well mention that the standard practice of having invalid input being undefined behaviour came after this question. – Kevin Brown – 2015-06-15T16:41:24.020
2Unless I'm missing something,
(C)(D)(L)MMI
would be 452,001. How did you get your value? Additionally, does this need to support "improper" forms (e.g.IC
instead ofXCIX
)? – Anon. – 2011-02-10T02:58:11.287Improper to me means illegal and thus should return 0. – Martin York – 2011-02-10T19:46:27.310
@Anon: The number was a mistype from when I changed the original third test case. It does not need to support improper forms, as it would be considered invalid input. – Kevin Brown – 2011-02-10T20:21:24.663
1
@KevinBrown I don't see a source or explanation for the parenthesised letters. I think you should change the spec to match http://codegolf.stackexchange.com/q/16254/43319 and then the answers from there can be migrated here.
– Adám – 2017-02-14T11:14:15.143