Island Life

< テストの話 | ピアノレッスン12回目 >

2011/09/01

アラビア数字・ローマ数字変換

お題:アラビア数字・ローマ数字変換 - No Programming, No Life

アラビア数字 <=> ローマ数字変換を行う関数、arabicToRoman および romanToArabic を実装せよ。

条件)

  • ローマ数字の表記法についてはローマ数字 - Wikipediaを参考にすること。
  • ローマ数字は半角英「I,V,X,L,C,D,M,i,v,x,l,c,d,m」のみ使用した文字列とし、それ以外はエラーとする。
  • アラビア数字は整数 1 から 3999 のみ使用するものとし、それ以外はエラーとする。

Common Lispには時々わけのわからない機能がある。formatの~@Rもそのひとつ。

roman->arabicの方はちょっとズルした。formatの~@Rに対称な機能がparse-integerに無いのは美しく無いよなあ。

実行例

cl-user> (arabic->roman 11)
"XI"
cl-user> (arabic->roman 1888)
"MDCCCLXXXVIII"
cl-user> (roman->arabic "mdccclxxxviii")
1888
cl-user> (roman->arabic "McmXLv")
1945

Gaucheのformatはさすがにこの機能まで実装していないけれど、 slibのformatが使える。

(追記2011/09/03 09:19:59 UTC): さすがSmalltalk、そこにシビれる!あこがれるゥ! アラビア数字・ローマ数字変換をSqueak Smalltalkで

自由気ままなSqueak Smalltalkにはわけの分からない機能がいやというほどあります。Integer>>#printStringRoman や String>>#romanNumber もそのひとつ。Integer と String に対象の機能があるのは美しいですね。^^;

Tags: Lisp, Programming

Post a comment

Name: