CodingDojoの第3弾ということで、KataRomanNumerals(アラビア数字をローマ数字に変換する)をやってみた。
KataRomanNumerals
ローマ人は頭いいやつばかりだ。だから何百年もヨーロッパを支配していた。
コンクリートやまっすぐな道、ビキニを発明したんだけど、発見できなかったものもあった。
それが数字のゼロ。
開拓史を書いたが、ローマ人が考えた数字のシステムが今でも使われている。
例えば、BBCはプログラムの日付を書くのにローマ数字を使っている。
ローマ人は、「I, V, X, L, C, D, M」をつかって数字を書いていた。
(まっすぐな線を使うので石版に書きやすかったから)
このKataは、アラビア数字をローマ数字に変換するメソッドをつくること。
どのように変換するかは、this useful reference websiteを見てね。
(補足:日本語なら ローマ数字 - Wikipedia がわかりやすい。)
3,000より大きな数字は変換できなくても良い。
(というかローマ数字は4,000以上の値は表現できないからね)
999のとき、IMのように表現はできない。
一番左の桁からはじめて表現していく。値がゼロの場合は、その桁を飛ばして各桁を表す。
1990を例にとると、1000=M、900=CM、90=XCとなり、MCMXCと表す。
2008の場合は、2000=MM、8=VIIIとなり、MMVIIIと表す。
補足
- I → 1
- V → 5
- X → 10
- L → 50
- C → 100
- D → 500
- M → 1000
ただし4つ以上同じ文字を並べることができないため、4はIIII、9はVIIIIとは表現できない。
シンボルより小さい数字になるときは左側に、大きい数字になるときは右側にシンボルを置く。
例えば、4ならIV、6ならVI、9ならIX、11ならXIといった具合。
手がかり
- キレイで読みやすいコードを書くことができますか?
- メインメソッドからメソッドを抽出したほうが良いかな?それともメインメソッド1つに全部ぶち込んだほうが良いかな?
- もしアルゴリズムを知らないなら、TDDすれば思いつくんじゃない?
- テストがわかれば、最終的にアルゴリズムのデザインにも影響するんじゃない?
- TDDより先にアルゴリズムを考えたほうがよいですか?
- もしこのアルゴリズムを知ってるなら、TDDできますか?
- 別のアルゴリズムを考えられますか?
- 全部の数字を持つために適したデータ構造は何ですか?(IとかVとかDとかMとか)
- テストケースをFITを使ったCSV、またはxUnitで書けますか?
- 自分が書いたテストが正しいかどうか、確認する最適な方法はなんですか?
実践
私が実装したソースコードを、GitHubにアップロードした。Nの位を1つずつ取り出して、あらかじめ定義しておいたローマ数字の配列から対象の文字列を取得する方法で実装した。
たぶん、ここまでやらなくても、「I, V, XI, X, XC, C, D, CM, M」を定義するだけで変換できそう。
あと、相変わらずクソみたいなメソッド設計だなって我ながらに思う。
以上
written by @bc_rikko
0 件のコメント :
コメントを投稿