YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

Project Euler #89

はじめに

こんにちは、Python界の情弱です。ブログをかれこれ1ヶ月近く放置していました。近年稀に見る多忙さでしたが無事に乗り切りました。(限界80%くらい)というわけで、久々にProject Eulerを解いてみたので書いてみます。

問題と自分の解答

問題はここ。有志で問題を日本語訳してくれています。嬉しいですね。

自分の解答はここ。

はまったところ

ローマ数字をどうやってアラビア数字に治すかって所で、適当に書いたらIVとかIXのパターンをちゃんと処理できてなくておかしな値になってた。で、こんな実装に。

let roman_chars = 
    [('I', 1); ('V', 5); ('X', 10); ('L', 50); ('C', 100); ('D', 500); ('M', 1000)];;

let roman_to_num roman =
  let num = ref 0 in
  let prev = ref 'I' in
  try
    for i = 0 to String.length roman - 1 do
      if i = 0 then
        begin
          num := !num + List.assoc roman.[i] roman_chars;
          prev := roman.[i]
        end
      else
        let p = List.assoc !prev roman_chars
        and c = List.assoc roman.[i] roman_chars in
        if p >= c 
        then num := !num + c
        else num := !num - p * 2 + c;
        prev := roman.[i]
    done;
    !num
  with
  | Not_found ->
      Printf.printf "  convert (%d) %s\n%!" !num roman;
      !num
;;

stringそのまま使ったからなんかすごく関数型っぽくない書き方になっちゃった。まあいいや。