# Calculating roman numerals

Ok, I’m having trouble with another exercise in this book. It has
asked me to write a program that will calculate the old school roman
numeral value for a given modern number (up to the thousands). To
clarify, old school roman numerals didn’t do the subtraction thing, so
4 is IIII, nine is VIIII, etc. I’ve played around with a few options
using division, loops and modulus, but can’t seem to get my brain
around the problem…any suggestions?

Shiloh

[Shiloh M. [email protected], 2007-01-02 22.35 CET]

Ok, I’m having trouble with another exercise in this book. It has
asked me to write a program that will calculate the old school roman
numeral value for a given modern number (up to the thousands). To
clarify, old school roman numerals didn’t do the subtraction thing, so
4 is IIII, nine is VIIII, etc. I’ve played around with a few options
using division, loops and modulus, but can’t seem to get my brain
around the problem…any suggestions?

A hint: Try loops and subtractions.

Good luck.

Thank you. That gave me an entirely new way to look at this. I am
working on one solution now, but I will try that next. If they both
work I’ll post both as I am curious which will be more efficient.

On Wed, Jan 03, 2007 at 06:35:02AM +0900, Shiloh M. wrote:
} Ok, I’m having trouble with another exercise in this book. It has
} asked me to write a program that will calculate the old school roman
} numeral value for a given modern number (up to the thousands). To
} clarify, old school roman numerals didn’t do the subtraction thing, so
} 4 is IIII, nine is VIIII, etc. I’ve played around with a few options
} using division, loops and modulus, but can’t seem to get my brain
} around the problem…any suggestions?

We recently had a golfing competition at work on going the other
direction
(i.e. roman numeral to arabic). Our best solution:

def x s
p=t=0
s.scan(/./){|r|
i=’ IVXLCDM’.index r
c=10**(i/2)/(2-i%2)
t+= p<c ?-p:p
p=c
}
t+p
end

} Shiloh
–Greg

Gregory S. wrote:

(i.e. roman numeral to arabic). Our best solution:
end

} Shiloh
–Greg

Another way:

require ‘enumerator’
def y s
t=0
(s.split("").map{|c|
n=’ IVXLCDM’.index c;10**(n/2)/(2-n%2)}<<0).
each_cons(2){|a,b| t+= a<b ?-a:a}
t
end

Shiloh M. wrote:

It is better to rule in hell than serve in heaven.

class Integer
def to_roman
“I =1 V =5 X = 10 L = 50
C = 100 D = 500 M = 1000”.
scan( / ([A-Z]) \s = \s (\d+) /x ).
map{|letter,val| [ letter, val.to_i ] }.
sort_by{|a| -a.last}.
inject( [ “”, self ] ){|roman, pair|
[ roman.first + pair.first * (roman.last / pair.last),
roman.last % pair.last ] }.
first
end
end

Shiloh M. wrote:

Ok, I’m having trouble with another exercise in this book. It has

Which book?

JB

There was a related ruby quiz:

Ruby Quiz - Roman Numerals (#22)

-rb.

On 1/2/07, Shiloh M. [email protected] wrote:

Ok, I’m having trouble with another exercise in this book. It has
asked me to write a program that will calculate the old school roman
numeral value for a given modern number (up to the thousands). To
clarify, old school roman numerals didn’t do the subtraction thing, so
4 is IIII, nine is VIIII, etc. I’ve played around with a few options
using division, loops and modulus, but can’t seem to get my brain
around the problem…any suggestions?

Shiloh

Look for older thread “Need help with a program”.

On 1/2/07, Shiloh M. [email protected] wrote:

Ok, I’m having trouble with another exercise in this book. It has
asked me to write a program that will calculate the old school roman
numeral value for a given modern number (up to the thousands). To
clarify, old school roman numerals didn’t do the subtraction thing, so
4 is IIII, nine is VIIII, etc. I’ve played around with a few options
using division, loops and modulus, but can’t seem to get my brain
around the problem…any suggestions?

Lest we all forget about the code snippets on RubyForge …

http://rubyforge.org/snippet/detail.php?type=snippet&id=135

Should do all you need (and more)

Blessings,
TwP

On Wed, 03 Jan 2007 06:35:02 +0900, Shiloh M. wrote:

Ok, I’m having trouble with another exercise in this book. It has
asked me to write a program that will calculate the old school roman
numeral value for a given modern number (up to the thousands). To
clarify, old school roman numerals didn’t do the subtraction thing, so
4 is IIII, nine is VIIII, etc. I’ve played around with a few options
using division, loops and modulus, but can’t seem to get my brain
around the problem…any suggestions?

Shiloh

Many people have answered, but since I’m a beginner I would like to have
some comments on the following. Which I think is pretty ruby-esque

ans=0
roman=“XVIII”
{“X”=>10,“V”=>5,“I”=>1}.each_pair do |letter,
number|ans+=roman.count(letter)*number end;ans

Kind regards,
Gerald

On 1/4/07, Tim P. [email protected] wrote:

Lest we all forget about the code snippets on RubyForge …

The code snippets thing is super cool, if only it was better
organized. Not sure if we can do much with it, since it’s mostly up
to GForge…

I just wish it was easier to navigate, search, etc.

Gerald E. wrote:

Shiloh
Gerald
The original poster asked for a way to translate from modern numerals
to roman numerals. You’re doing the opposite.

Your method will convert old-school roman numerals, but it
won’t work for “XIV”.