Römische Zahlen (4)
Kategorie
val
letters
= Array('M','D','C','L','X','V','I')
case class Container( var value : Int)
trait SimpleRoman {
def value : Int
def arabicValue(i : Int) : Int = Math.pow(10, (letters.length - 1 - i) / 2).toInt * (if (i % 2 == 1) 5 else 1)
override def toString = {
if (value < 1) "" else if (value > 3999) "N" else {
var roman = ""
var i : Int = value
for( j <- 0 to letters.length-1 ) {
val actualValue = arabicValue(j)
while (i > actualValue || !(i < actualValue)) {
roman += letters(j)
i -= actualValue
}
}
roman
}
}
}
trait SubstractionRoman extends SimpleRoman {
override def toString = {
var roman = super.toString
for( j <- 1 to letters.length-2) {
val search2 = ""+letters(j+1)+letters(j+1)+letters(j+1)+letters(j+1)
val search1 = ""+letters(j) + search2
roman = roman.replace(search1,""+letters(j+1)+letters(j-1))
roman = roman.replace(search2,""+letters(j+1)+letters(j))
}
roman
}
}
implicit def IntToSubstractionRoman(i : Int) = new Container(i) with SubstractionRoman
implicit def RomanToInt(c : Container) = c.value
Sieht mehr oder weniger aus, wie die C# Implementierung.
Jedoch ein Auge auf die implicit def Zeilen, diese ermöglichen es, dass man mit den Römischen Zahlen rechnen kann wie mit "normalen"
var a = new Container(1984) with SimpleRoman
var b = new Container(1984)
var c = new Container(1984) with SubstractionRoman
var d = a
println(a)
println(b)
println(c)
println(d)
a.value += b.value
b.value = a.value
c.value = a.value
d = c
println(a)
println(b)
println(c)
println(d)
a = ( 1 + 1983 )
b = ( 1 + a )
println(a)
println(b)
Gruß JJR
P.S.: Und noch ein schönes Wochenende!
case class Container( var value : Int)
trait SimpleRoman {
def value : Int
def arabicValue(i : Int) : Int = Math.pow(10, (letters.length - 1 - i) / 2).toInt * (if (i % 2 == 1) 5 else 1)
override def toString = {
if (value < 1) "" else if (value > 3999) "N" else {
var roman = ""
var i : Int = value
for( j <- 0 to letters.length-1 ) {
val actualValue = arabicValue(j)
while (i > actualValue || !(i < actualValue)) {
roman += letters(j)
i -= actualValue
}
}
roman
}
}
}
trait SubstractionRoman extends SimpleRoman {
override def toString = {
var roman = super.toString
for( j <- 1 to letters.length-2) {
val search2 = ""+letters(j+1)+letters(j+1)+letters(j+1)+letters(j+1)
val search1 = ""+letters(j) + search2
roman = roman.replace(search1,""+letters(j+1)+letters(j-1))
roman = roman.replace(search2,""+letters(j+1)+letters(j))
}
roman
}
}
implicit def IntToSubstractionRoman(i : Int) = new Container(i) with SubstractionRoman
implicit def RomanToInt(c : Container) = c.value
Sieht mehr oder weniger aus, wie die C# Implementierung.
Jedoch ein Auge auf die implicit def Zeilen, diese ermöglichen es, dass man mit den Römischen Zahlen rechnen kann wie mit "normalen"
var a = new Container(1984) with SimpleRoman
var b = new Container(1984)
var c = new Container(1984) with SubstractionRoman
var d = a
println(a)
println(b)
println(c)
println(d)
a.value += b.value
b.value = a.value
c.value = a.value
d = c
println(a)
println(b)
println(c)
println(d)
a = ( 1 + 1983 )
b = ( 1 + a )
println(a)
println(b)
Gruß JJR
P.S.: Und noch ein schönes Wochenende!