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

···

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

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?

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

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

} 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

···

On Wed, Jan 03, 2007 at 06:35:02AM +0900, Shiloh Madsen 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?

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?

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 Wed, 03 Jan 2007 06:35:02 +0900, Shiloh Madsen 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?

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.

[Shiloh Madsen <shiloh.madsen@gmail.com>, 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.
--

--
-I didn't know you could stop being a God.
-You can stop being anything.

} 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

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

···

On Wed, Jan 03, 2007 at 06:35:02AM +0900, Shiloh Madsen wrote:

On Wed, 03 Jan 2007 06:35:02 +0900, Shiloh Madsen 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

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