読者です 読者をやめる 読者になる 読者になる

YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

Project Euler #89

OCaml Algorithm

はじめに

こんにちは、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そのまま使ったからなんかすごく関数型っぽくない書き方になっちゃった。まあいいや。