< テストの話 | ピアノレッスン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