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
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”.