Römische Zahlen (1)
Allgemein C# Scala Code Kata
Die meisten Implementierungen um eine arabische Zahl in eine römische zu konvertieren sehen (mehr oder weniger) wie folgt aus:
static uint[] nums = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
static string[] rum = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
static string ToRoman(uint number)
{
string value = "";
for (int i = 0; i < nums.Length && number != 0; i++)
{
while (number >= nums[i])
{
number -= nums[i];
value += rum[i];
}
}
return value;
}
Was mich bei dieser Implementierung stört sind die beiden Arrays, weil man ja eigentlich nur eines bräuchte ...
Kategorie Die meisten Implementierungen um eine arabische Zahl in eine römische zu konvertieren sehen (mehr oder weniger) wie folgt aus:
static uint[] nums = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
static string[] rum = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
static string ToRoman(uint number)
{
string value = "";
for (int i = 0; i < nums.Length && number != 0; i++)
{
while (number >= nums[i])
{
number -= nums[i];
value += rum[i];
}
}
return value;
}
Was mich bei dieser Implementierung stört sind die beiden Arrays, weil man ja eigentlich nur eines bräuchte ...
Also versuchte ich, diese Redundanz zu
entfernen, das Ergebnis hat zwar keine Redundanz (von Informationen), aber
wirklich lesbar ist es nicht
public static char[] letters = { 'M', 'D', 'C', 'L', 'X', 'V', 'I' };
public static string ToRoman(int arabic) {
if (arabic < 1) return string.Empty;
if (arabic > 3999) return "N";
string roman = string.Empty;
int N = arabic;
for (int i = 0; i < letters.Length; i++) {
for (int j = 0; j <= 1; j++) {
int n = (int)Math.Pow(10, (letters.Length - 1 - i) / 2) * ((i % 2 == 1) ? 5 : 1);
string l = string.Empty;
if (i < letters.Length - 1) {
int k = (j == 0) ? 0 : (i % 2 == 1 ? 1 : 2);
switch (k) {
case 0:
l += letters[i];
break;
case 1:
n -= n / 5;
l += letters[i + 1] + letters[i];
break;
case 2:
n -= n / 10;
l += letters[i + 2] + letters[i];
break;
default:
l = string.Empty;
n = 0;
break;
}
} else {
l += letters[i];
}
while (N >= n) {
roman += l;
N -= n;
}
}
}
return roman;
}
Da das Ergebnis nicht richtig befriedigend ist, galt es eine andere Lösung zu finden.
Gruß JJR
P.S.: Mehr heute nachmittag Römische Zahlen (2)
public static char[] letters = { 'M', 'D', 'C', 'L', 'X', 'V', 'I' };
public static string ToRoman(int arabic) {
if (arabic < 1) return string.Empty;
if (arabic > 3999) return "N";
string roman = string.Empty;
int N = arabic;
for (int i = 0; i < letters.Length; i++) {
for (int j = 0; j <= 1; j++) {
int n = (int)Math.Pow(10, (letters.Length - 1 - i) / 2) * ((i % 2 == 1) ? 5 : 1);
string l = string.Empty;
if (i < letters.Length - 1) {
int k = (j == 0) ? 0 : (i % 2 == 1 ? 1 : 2);
switch (k) {
case 0:
l += letters[i];
break;
case 1:
n -= n / 5;
l += letters[i + 1] + letters[i];
break;
case 2:
n -= n / 10;
l += letters[i + 2] + letters[i];
break;
default:
l = string.Empty;
n = 0;
break;
}
} else {
l += letters[i];
}
while (N >= n) {
roman += l;
N -= n;
}
}
}
return roman;
}
Da das Ergebnis nicht richtig befriedigend ist, galt es eine andere Lösung zu finden.
Gruß JJR
P.S.: Mehr heute nachmittag Römische Zahlen (2)