Erlang/Elixir はバイナリのパースが得意ということで。
ローマ数字で書かれた数をパースする関数を書いてみました。
defmodule RomanNumerals do @moduledoc """ Documentation for RomanNumerals. """ def parse(roman) when is_binary(roman), do: parse(roman, 0) defp parse("", sum), do: sum defp parse(<<"M", rest::binary>>, sum), do: parse(rest, sum + 1000) defp parse(<<"CM", rest::binary>>, sum), do: parse(rest, sum + 900) defp parse(<<"D", rest::binary>>, sum), do: parse(rest, sum + 500) defp parse(<<"CD", rest::binary>>, sum), do: parse(rest, sum + 400) defp parse(<<"C", rest::binary>>, sum), do: parse(rest, sum + 100) defp parse(<<"XC", rest::binary>>, sum), do: parse(rest, sum + 90) defp parse(<<"L", rest::binary>>, sum), do: parse(rest, sum + 50) defp parse(<<"XL", rest::binary>>, sum), do: parse(rest, sum + 40) defp parse(<<"X", rest::binary>>, sum), do: parse(rest, sum + 10) defp parse(<<"IX", rest::binary>>, sum), do: parse(rest, sum + 9) defp parse(<<"V", rest::binary>>, sum), do: parse(rest, sum + 5) defp parse(<<"IV", rest::binary>>, sum), do: parse(rest, sum + 4) defp parse(<<"I", rest::binary>>, sum), do: parse(rest, sum + 1) end
iex> RomanNumerals.parse("MCMXC") 1990
正しい形式の 3,999 までの値をパースできるはずです。
正しくない形式(LL
とか XXXXXXX
とか)もパースできてしまうので、それを受け付けないようにするにはもう一工夫必要。
いつか聴くはずっと聴かない:MCMXC a.D.
Enigma のファーストアルバム「MCMXC a.D.」。その名の通り、西暦 1990 年のリリース。
- アーティスト: エニグマ
- 出版社/メーカー: EMIミュージック・ジャパン
- 発売日: 1996/07/24
- メディア: CD
- 購入: 1人 クリック: 18回
- この商品を含むブログ (9件) を見る