2015/04/27

【超訳】CodingDojo:アラビア数字をローマ数字に変換(KataRomanNumerals)

photo by Paul L Dineen

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 件のコメント :

コメントを投稿