From 40262304a10de936aff0b98c8526f7389a7f520f Mon Sep 17 00:00:00 2001 From: Eduardo Stalinho Date: Wed, 20 Feb 2019 23:45:13 -0300 Subject: [PATCH] Adiciona romano em elixir (tem muito pra melhorar) --- romanos_20190213/roman.ex | 38 ++++++++++++++++++++ romanos_20190213/roman_test.exs | 61 +++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 romanos_20190213/roman.ex create mode 100644 romanos_20190213/roman_test.exs diff --git a/romanos_20190213/roman.ex b/romanos_20190213/roman.ex new file mode 100644 index 0000000..034776c --- /dev/null +++ b/romanos_20190213/roman.ex @@ -0,0 +1,38 @@ +defmodule Roman do + def to_integer(I), do: 1 + def to_integer(V), do: 5 + def to_integer(X), do: 10 + def to_integer(L), do: 50 + def to_integer(C), do: 100 + def to_integer(D), do: 500 + def to_integer(M), do: 1000 + def to_integer(x) do + list = to_list(x) + convert(list, 0) + end + + defp to_list(x) do + [_, string] = String.split(Atom.to_string(x), ".") + String.codepoints(string) + end + + defp get_value(numeral) do + to_integer(String.to_atom("Elixir." <> numeral)) + end + + + defp convert([first | [ second | tail] ], accumulator) do + cond do + get_value(first) >= get_value(second) -> convert([second | tail], accumulator) + get_value(first) + get_value(first) < get_value(second) -> convert([second | tail], accumulator) - get_value(first) + end + end + + defp convert([first | tail], accumulator) do + get_value(first) + convert(tail, accumulator) + end + + defp convert([], accumulator) do + accumulator + end +end diff --git a/romanos_20190213/roman_test.exs b/romanos_20190213/roman_test.exs new file mode 100644 index 0000000..1d1e204 --- /dev/null +++ b/romanos_20190213/roman_test.exs @@ -0,0 +1,61 @@ +Code.require_file "roman.ex", __DIR__ +ExUnit.start() +defmodule AssertionTest do + use ExUnit.Case, async: true + + test "roman I returns 1" do + assert Roman.to_integer(I) == 1 + end + + test "roman V returns 5" do + assert Roman.to_integer(V) == 5 + end + + test "roman X returns 10" do + assert Roman.to_integer(X) == 10 + end + + test "roman L returns 50" do + assert Roman.to_integer(L) == 50 + end + + test "roman C returns 100" do + assert Roman.to_integer(C) == 100 + end + + test "roman D returns 500" do + assert Roman.to_integer(D) == 500 + end + + test "roman M returns 1000" do + assert Roman.to_integer(M) == 1000 + end + + test "roman II returns 2" do + assert Roman.to_integer(II) == 2 + end + + test "roman III returns 3" do + assert Roman.to_integer(III) == 3 + end + + test "roman VI returns 6" do + assert Roman.to_integer(VI) == 6 + end + + test "roman IV returns 4" do + assert Roman.to_integer(IV) == 4 + end + + test "roman XLII returns 4" do + assert Roman.to_integer(XLII) == 42 + end + + test "roman XXXIV returns 34" do + assert Roman.to_integer(XXXIV) == 34 + end + + test "roman MMXIX returns 2019" do + assert Roman.to_integer(MMXIX) == 2019 + end +end