From b12821147d95e606e665ddca68dc1168796be439 Mon Sep 17 00:00:00 2001 From: fiatcode Date: Tue, 10 Feb 2026 09:12:34 +0700 Subject: [PATCH] REFACTOR: apply DRY, remove magic numbers, add `conversionRules` domain --- lib/roman_numerals.dart | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/lib/roman_numerals.dart b/lib/roman_numerals.dart index f4fbc57..f4666c1 100644 --- a/lib/roman_numerals.dart +++ b/lib/roman_numerals.dart @@ -1,25 +1,15 @@ String integerToRoman(int number) { - const romanSymbols = { - 10: 'X', - 9: 'IX', - 8: 'VIII', - 7: 'VII', - 6: 'VI', - 5: 'V', - 1: 'I', - }; + const conversionRules = [(10, 'X'), (9, 'IX'), (5, 'V'), (4, 'IV'), (1, 'I')]; - if (_isSubtractiveCase(number)) { - return romanSymbols[1]! + romanSymbols[5]!; + final result = StringBuffer(); + var remaining = number; + + for (final (value, symbol) in conversionRules) { + while (remaining >= value) { + result.write(symbol); + remaining -= value; + } } - if (_canRepeatSymbol(number)) { - return romanSymbols[1]! * number; - } - - return romanSymbols[number] ?? ''; + return result.toString(); } - -bool _isSubtractiveCase(int number) => number == 4; - -bool _canRepeatSymbol(int number) => number < 4;