YAPC::EU 2018 Glasgow Update!
This commit is contained in:
parent
22f33d4004
commit
4e2d22a71d
1170 changed files with 15042 additions and 3047 deletions
|
|
@ -3,29 +3,43 @@ shared void run() {
|
|||
class Numeral(shared Character char, shared Integer int) {}
|
||||
|
||||
value tiers = [
|
||||
[Numeral('I', 1), Numeral('V', 5), Numeral('X', 10)],
|
||||
[Numeral('X', 10), Numeral('L', 50), Numeral('C', 100)],
|
||||
[Numeral('I', 1), Numeral('V', 5), Numeral('X', 10)],
|
||||
[Numeral('X', 10), Numeral('L', 50), Numeral('C', 100)],
|
||||
[Numeral('C', 100), Numeral('D', 500), Numeral('M', 1k)]
|
||||
];
|
||||
|
||||
|
||||
String toRoman(Integer hindu, Integer power = 2) {
|
||||
assert(exists tier = tiers[power]);
|
||||
if(hindu <= 0) {
|
||||
|
||||
String toRoman(Integer hindu, Integer tierIndex = 2) {
|
||||
|
||||
assert (exists tier = tiers[tierIndex]);
|
||||
|
||||
" Finds if it's a two character numeral like iv, ix, xl, xc, cd and cm."
|
||||
function findTwoCharacterNumeral() =>
|
||||
if (exists bigNum = tier.rest.find((numeral) => numeral.int - tier.first.int <= hindu < numeral.int))
|
||||
then [tier.first, bigNum]
|
||||
else null;
|
||||
|
||||
if (hindu <= 0) {
|
||||
// if it's zero then we are done!
|
||||
return "";
|
||||
} else if(exists num = tier.rest.find((Numeral elem) => elem.int - tier.first.int <= hindu < elem.int)) {
|
||||
return "``tier.first.char````num.char````toRoman(hindu - (num.int - tier.first.int), power)``";
|
||||
} else if(exists num = tier.reversed.find((Numeral elem) => hindu >= elem.int)) {
|
||||
return "``num.char````toRoman(hindu - num.int, power)``";
|
||||
} else {
|
||||
return toRoman(hindu, power - 1);
|
||||
}
|
||||
else if (exists [smallNum, bigNum] = findTwoCharacterNumeral()) {
|
||||
value twoCharSymbol = "``smallNum.char````bigNum.char``";
|
||||
value twoCharValue = bigNum.int - smallNum.int;
|
||||
return "``twoCharSymbol````toRoman(hindu - twoCharValue, tierIndex)``";
|
||||
}
|
||||
else if (exists num = tier.reversed.find((Numeral elem) => hindu >= elem.int)) {
|
||||
return "``num.char````toRoman(hindu - num.int, tierIndex)``";
|
||||
}
|
||||
else {
|
||||
// nothing was found so move to the next smaller tier!
|
||||
return toRoman(hindu, tierIndex - 1);
|
||||
}
|
||||
}
|
||||
|
||||
assert(toRoman(1) == "I");
|
||||
assert(toRoman(2) == "II");
|
||||
assert(toRoman(4) == "IV");
|
||||
assert(toRoman(1666) == "MDCLXVI");
|
||||
assert(toRoman(1990) == "MCMXC");
|
||||
assert(toRoman(2008) == "MMVIII");
|
||||
assert (toRoman(1) == "I");
|
||||
assert (toRoman(2) == "II");
|
||||
assert (toRoman(4) == "IV");
|
||||
assert (toRoman(1666) == "MDCLXVI");
|
||||
assert (toRoman(1990) == "MCMXC");
|
||||
assert (toRoman(2008) == "MMVIII");
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue