RomanNumeral to Integer in Erlang

投稿者 okkez 2007-06-03 00:22:00 GMT

昨日、帰宅後に書いた奴の逆バージョン。

D(500), L(50), V(5) が複数ある場合のチェックは抜けてるけど大体できたので書いておく。

to_integer
r2i(Str) -> [H|T] = [1000, 500, 100, 50, 10, 5, 1], {Matched, Unmatched} = lists:partition(fun(X) -> [X] =:= old_roman_unit(H) end, Str), check(Str, Matched), lists:sum(lists:map(fun({Num, L}) -> Num * length(L) end, r2i(T, Unmatched, [{H, Matched}]))). r2i([], _, L) -> L; r2i([H|T], Str, L) -> {Matched, Unmatched} = lists:partition(fun(X) -> [X] =:= old_roman_unit(H) end, Str), check(Str, Matched), r2i(T, Unmatched, [{H, Matched}|L]). check(Orig, L) -> if length(Orig) < length(L) -> false; true -> case lists:all(fun({X,Y}) -> X =:= Y end, lists:zip(lists:sublist(Orig,1,length(L)),L)) of true -> true; false -> throw('ArgumentError') end end.

自分で作った lib_misc:p/1 がかなり便利。Ruby の Kernel#p というか Ruby1.9 の Kernel#tap ぽく使える。

Erlang勉強会#1

カテゴリ  | タグ

コメントは許可されていません