Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions romanos_20190213/roman.ex
Original file line number Diff line number Diff line change
@@ -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
61 changes: 61 additions & 0 deletions romanos_20190213/roman_test.exs
Original file line number Diff line number Diff line change
@@ -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