Skip to content

Instantly share code, notes, and snippets.

@fumokmm
Created August 23, 2011 22:16
Show Gist options
  • Save fumokmm/1166752 to your computer and use it in GitHub Desktop.
Save fumokmm/1166752 to your computer and use it in GitHub Desktop.
お題:アラビア数字・ローマ数字変換 solved by Groovy
// 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