Created
August 23, 2011 22:16
-
-
Save fumokmm/1166752 to your computer and use it in GitHub Desktop.
お題:アラビア数字・ローマ数字変換 solved by Groovy
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// http://d.hatena.ne.jp/fumokmm/20110822/1314013182 | |
// ローマ数字定義 | |
def romans = [ | |
I :1 , | |
IV:4 , V:5 , IX:9 , X:10 , | |
XL:40 , L:50 , XC:90 , C:100 , | |
CD:400, D:500, CM:900, M:1000 | |
] | |
// シンボル化能力を追加 | |
String.metaClass.getSymbol = { delegate.intern() } | |
Integer.metaClass.getSymbol = { delegate.toString().intern() } | |
// 文字列自体に変換能力を追加 | |
romans.each { r, a -> | |
r.symbol.metaClass.toArabic = { a } | |
a.symbol.metaClass.toRoman = { r } | |
} | |
// アラビア数字 -> ローマ数字 | |
def arabicToRoman = { int arabic -> | |
('1'*arabic).findAll( | |
~/${romans.values().sort{-it}.collect{ "1{$it}" }.join('|')}/ | |
)*.size()*.symbol*.toRoman().join() | |
} | |
// ローマ数字 -> アラビア数字 | |
def romanToArabic = { String roman -> | |
roman.findAll( | |
~/(${romans.keySet().sort{-it.size()}.join('|')})/ | |
)*.symbol*.toArabic().sum() | |
} | |
// テスト | |
assert arabicToRoman(11) == 'XI' | |
assert romanToArabic('XI') == 11 | |
assert arabicToRoman(12) == 'XII' | |
assert romanToArabic('XII') == 12 | |
assert arabicToRoman(14) == 'XIV' | |
assert romanToArabic('XIV') == 14 | |
assert arabicToRoman(18) == 'XVIII' | |
assert romanToArabic('XVIII') == 18 | |
assert arabicToRoman(24) == 'XXIV' | |
assert romanToArabic('XXIV') == 24 | |
assert arabicToRoman(43) == 'XLIII' | |
assert romanToArabic('XLIII') == 43 | |
assert arabicToRoman(99) == 'XCIX' | |
assert romanToArabic('XCIX') == 99 | |
assert arabicToRoman(495) == 'CDXCV' | |
assert romanToArabic('CDXCV') == 495 | |
assert arabicToRoman(1888) == 'MDCCCLXXXVIII' | |
assert romanToArabic('MDCCCLXXXVIII') == 1888 | |
assert arabicToRoman(1945) == 'MCMXLV' | |
assert romanToArabic('MCMXLV') == 1945 | |
assert arabicToRoman(3999) == 'MMMCMXCIX' | |
assert romanToArabic('MMMCMXCIX') == 3999 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment