RomanNumeral to Integer in Erlang
昨日、帰宅後に書いた奴の逆バージョン。
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 ぽく使える。
Posted in Programming | atom