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