Coding Challenge Of The Day
-
You get points for at least writing code. As opposed to some members... (dark looks all 'round).
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
Just like positive reenforcment in the schools today, everybody gets a trophy, even when they're wrong. Thanks! :thumbsup: :-D
It was broke, so I fixed it.
-
Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
as a nerd, i can't resist... between, it's only a quick n' dirty solution:
public static int RomanToArabic(string romans) {
if (string.IsNullOrWhiteSpace(romans))
{
return 0;
}
//remove whitespace...
romans = romans.Replace(" ", string.Empty);
//make sure no one pass out an "A" for example...
if (!Regex.IsMatch(romans, "(I|V|X|C|M|D|L)+"))
{
throw new ArgumentException("Invalid numeral!!");
}//actual validation that matters (based on http://en.wikipedia.org/wiki/Roman\_numerals): //The symbols "I", "X", "C", and "M" can be repeated three times in succession, but no more. "D", "L", and "V" can never be repeated. string invalidSequences = "(XXXX+)|(IIII+)|(CCCC+)|(MMMM+)|(DD+)|(LL+)|(VV+)"; if (Regex.IsMatch(romans, invalidSequences)) { throw new ArgumentException("Invalid sequence!!"); } int result = 0; result += Regex.Matches(romans, "IV").Count \* 4; romans = Regex.Replace(romans, "IV", string.Empty); result += Regex.Matches(romans, "IX").Count \* 9; romans = Regex.Replace(romans, "IX", string.Empty); result += Regex.Matches(romans, "XL").Count \* 40; romans = Regex.Replace(romans, "XL", string.Empty); result += Regex.Matches(romans, "XC").Count \* 90; romans = Regex.Replace(romans, "XC", string.Empty); result += Regex.Matches(romans, "CD").Count \* 400; romans = Regex.Replace(romans, "CD", string.Empty); result += Regex.Matches(romans, "CM").Count \* 900; romans = Regex.Replace(romans, "CM", string.Empty); result += romans.Count(x => x == 'I'); romans = romans.Replace("I", string.Empty); result += romans.Count(x => x == 'V') \* 5; romans = romans.Replace("V", string.Empty); result += romans.Count(x => x == 'X') \* 10; romans = romans.Replace("X", string.Empty); result += romans.Count(x => x == 'L') \* 50; romans = romans.Replace("L", string.Empty); result += romans.Count(x => x == 'C') \* 100; romans = romans.Replace("C", string.Empty); result += romans.Count(x => x == 'D') \* 500; romans = romans.Replace("D", strin
-
Don't you mean 'V' him?
Steve _________________ I C(++) therefore I am
Good catch. Live long and prosper.
-
Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
Chris Maunder wrote:
Roman numerals to Arabic numbers
totally read this backward... at least now I have a solution for Arabic to Roman Numerals :doh:
Be The Noise
-
Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
-
Chris... you should know that we don't make homework here... :rolleyes:
[www.tamautomation.com] Robots, CNC and PLC machines for grinding and polishing.
Tried to leave a similar message earlier but CP locked. I was going to add this is not QA. :)
-
Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
private int ToInt(string rom)
{
int length = rom.Length;
int result = 0;
for(int loop1=0; loop1 < length; loop1++)
{
char current = rom[loop1];
char next = loop1 < length - 1 ? rom[loop1 + 1] : ' ';
switch(current)
{
case 'I':
result += next == 'V' || next == 'X' ? -1 : 1;
break;
case 'V':
result += 5;
break;
case 'X':
result += next == 'L' || next == 'C' ? -10 : 10;
break;
case 'L':
result += 50;
break;
case 'C':
result += next == 'D' || next == 'M' ? -100 : 100;
break;
case 'D':
result += 500;
break;
case 'M':
result += 1000;
break;
}
}
return result;
} -
#!/usr/bin/python
import sys
I=1
V=5
X=10
L=50
C=100
D=500
M=1000a=0
b=0
c=0for d in map(eval,sys.argv[1]):
if d > a:
b += d - c
c = 0
else:
b += c
c = d
a = d
print b + c -
I once met a well formed roman, when I was touring through Italy. :cool:
Chris Meech I am Canadian. [heard in a local bar] In theory there is no difference between theory and practice. In practice there is. [Yogi Berra] posting about Crystal Reports here is like discussing gay marriage on a catholic church’s website.[Nishant Sivakumar]
that would be where most Romans are, don't you think? :)
Luc Pattyn [My Articles] Nil Volentibus Arduum
-
Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
no arrays, no dictionaries, no obscure language, just some original coding:
public static bool TryParseRoman(string wellFormedRoman, out int val) {
val=0;
int prevDigit=0;
foreach (char c in wellFormedRoman) {
int index="IVXLCDM".IndexOf(c);
if (index<0) {val=0; return false;}
int digit=1;
int factor=5;
while (--index>=0) { digit*=factor; factor=7-factor; }
if (prevDigitBTW: is it Friday already?
:)
Luc Pattyn [My Articles] Nil Volentibus Arduum
-
Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
I'm unsure when I wrote this, but it must have been the 90s, in VAX C or DEC C. I'm shocked (shocked! I say) at the inconsistent braces. :wtf:
size_t
roman2dec
(
char *subject
)
{
size_t result = 0 , current , high = 0 ;
int index ;for ( index = strlen(subject)-1 ; index >= 0 ; index-- ) { switch ( (char) \*(subject + index) ) { case 'I' : case 'i' : current = 1 ; break ; case 'V' : case 'v' : current = 5 ; break ; case 'X' : case 'x' : current = 10 ; break ; case 'L' : case 'l' : current = 50 ; break ; case 'C' : case 'c' : current = 100 ; break ; case 'D' : case 'd' : current = 500 ; break ; case 'M' : case 'm' : current = 1000 ; break ; default : current = 0 ; break ; } if ( current < high ) result -= current ; else { result += current ; high = current ; } } return ( result ) ;
}
-
That's dreadful. :wtf:
-
for well-formed roman numerals, modern rules:
int r2d2(const char *r)
{
int val[128];
memset(val,0,sizeof(int)*128);
val['I']=1; val['V']=5;
val['X']=10; val['L']=50;
val['C']=100; val['D']=500; val['M']=1000;int a = 0;
for (int cv, pv = 0, i=strlen(r)-1;i>=0;i--)
{
cv = val[r[i]];
a += cv * (pv > cv ? -1 : 1);
pv = cv;
}return a;
}
Seems a waste of RAM.
-
I once met a well formed roman, when I was touring through Italy. :cool:
Chris Meech I am Canadian. [heard in a local bar] In theory there is no difference between theory and practice. In practice there is. [Yogi Berra] posting about Crystal Reports here is like discussing gay marriage on a catholic church’s website.[Nishant Sivakumar]
did you get here number?
-
Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
Apologies if other respondents have used a similar technique, but I have deliberately not looked at the other replies before attempting this challenge so that I am not influenced by other people's ideas. The following is in JavaScript, not obfuscated. The tricks are: Using an object literal as a lookup table and treating the double chars as subtractors from the second single chars (e.g. CM = [CM] + [M] = -100 + 1000 = 900). The only awkward part is preventing the last char being counted twice - once as a single char and once as a double char with no second char (this is done by appending '?').
// Roman to Arabic character translations
function RtoA(r) // r is roman numerals in any case
{
// Roman to Arabic conversion table
var Rch =
{
// Single chars: Add each value separately to the total
I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000,
// Double chars: Modify the sum of the second char as subtractors
CM: -100, CD: -100, XC: -10, XL: -10, IX: -1, IV: -1
};var R = r.toUpperCase(); // Ignore case var A = 0; // Arabic equivalent // Parse the text converting valid single chars and double chars // Set any invalid single or double char combinations as translating to zero for (var i = 0; i < R.length; i++) { var ch = R.charAt(i); A += Rch\[ch + (R.charAt(i + 1) || '?')\] // Double char conversion || Rch\[ch\] // Single char conversion || 0; // No conversion - invalid char }; // for return A;
}
alert(RtoA('MDC')); // 1600
alert(RtoA('mcmxcix')); // 1999 -
Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
First time post so hope this looks OK; 1 CRT "NUMERALS: ": ; INPUT NUM 2 CRT "NUMBER : ":ICONV(NUM, 'NR') 3 END Written in UniVerse BASIC.
-
Or, somewhat more tersely,
def r2d3(r,(s,M,C,X,I,z,V,L,D)=["%%s%d"%v for v in[1001,1000,100,10,1,0,5,50,500]]):
return eval("".join([
p%"+-"[eval( p%"%s>"%d%"")]
for d,p in zip(map(eval,'%sz'%r),map(eval,'s%s'%r))
][1:]))Or, somewhere in between:
def a6(roman):
if len(roman)==0:
return 0
mapping={"I":1,"V":5,"X":10,"L":50,"C":100,"D":500,"M":1000}
values=[mapping[digit] for digit in roman.upper()]
for i in range(len(values)):
if ialso, added capitalization tolerance, so that "MCM" and "mcm" evaluate the same. I haven't added a check that the argument is a valid roman numeral, but that is left as an exercise to the reader ;P
Φευ! Εδόμεθα υπό ρηννοσχήμων λύκων!
(Alas! We're devoured by lamb-guised wolves!) -
Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.
cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP
I hope it will be obscure enough. ;)
class Program
class Program
{
static int RomanToArabic(string r)
{
int x, y, z = x = y = 0;
foreach (char c in r)
y += ((z = (int)Math.Pow(10, (z = "ivxlcdm".IndexOf((char)(c | ' '))) / 2) * (1 + 4 * (z & 1))) > x ? -2 * x + (x = z) : x = z);
return y;
}static void Main(string\[\] args) { Console.WriteLine(RomanToArabic("MDC")); // 1600 Console.WriteLine(RomanToArabic("mcmxcix")); // 1999 Console.ReadKey(); } }
}
-
no arrays, no dictionaries, no obscure language, just some original coding:
public static bool TryParseRoman(string wellFormedRoman, out int val) {
val=0;
int prevDigit=0;
foreach (char c in wellFormedRoman) {
int index="IVXLCDM".IndexOf(c);
if (index<0) {val=0; return false;}
int digit=1;
int factor=5;
while (--index>=0) { digit*=factor; factor=7-factor; }
if (prevDigitBTW: is it Friday already?
:)
Luc Pattyn [My Articles] Nil Volentibus Arduum
This is definitely better than my attempt.
-
I hope it will be obscure enough. ;)
class Program
class Program
{
static int RomanToArabic(string r)
{
int x, y, z = x = y = 0;
foreach (char c in r)
y += ((z = (int)Math.Pow(10, (z = "ivxlcdm".IndexOf((char)(c | ' '))) / 2) * (1 + 4 * (z & 1))) > x ? -2 * x + (x = z) : x = z);
return y;
}static void Main(string\[\] args) { Console.WriteLine(RomanToArabic("MDC")); // 1600 Console.WriteLine(RomanToArabic("mcmxcix")); // 1999 Console.ReadKey(); } }
}
Nice. I like the
% ' '
bits, and appreciate you used literalVII
. :)Luc Pattyn [My Articles] Nil Volentibus Arduum