diff options
Diffstat (limited to 'assessments')
-rw-r--r-- | assessments/semiprimes/server/lib/server.ex | 29 | ||||
-rw-r--r-- | assessments/semiprimes/server/test/server_test.exs | 29 |
2 files changed, 49 insertions, 9 deletions
diff --git a/assessments/semiprimes/server/lib/server.ex b/assessments/semiprimes/server/lib/server.ex index 7240fc3426f0..c4088fb20ab5 100644 --- a/assessments/semiprimes/server/lib/server.ex +++ b/assessments/semiprimes/server/lib/server.ex @@ -4,15 +4,30 @@ defmodule Server do """ @doc """ - Hello world. + If `n` contains exactly two prime factors, return those prime factors; + otherwise, return nothing. + """ + def semiprime(n) do + case Cache.get(n) do + nil -> + case do_semiprime(n) do + nil -> + nil - ## Examples + res -> + Cache.put(n, res) + res + end - iex> Server.hello() - :world + hit -> + hit + end + end - """ - def hello do - :world + defp do_semiprime(n) do + case Math.factor(n) do + [_, _] = res -> res + _ -> nil + end end end diff --git a/assessments/semiprimes/server/test/server_test.exs b/assessments/semiprimes/server/test/server_test.exs index 4fa9b617bfd9..f327efb33abb 100644 --- a/assessments/semiprimes/server/test/server_test.exs +++ b/assessments/semiprimes/server/test/server_test.exs @@ -2,7 +2,32 @@ defmodule ServerTest do use ExUnit.Case doctest Server - test "greets the world" do - assert Server.hello() == :world + describe "semiprime" do + test "returns the factors when the number is semiprime" do + # Semiprimes below 30 + [ + {4, [2, 2]}, + {6, [2, 3]}, + {9, [3, 3]}, + {10, [2, 5]}, + {14, [2, 7]}, + {15, [3, 5]}, + {21, [3, 7]}, + {22, [2, 11]}, + {25, [5, 5]}, + {26, [2, 13]} + ] + |> Enum.each(fn {input, expected} -> + assert Server.semiprime(input) == expected + end) + end + + test "returns nothing when the number is a composite number" do + # Composite numbers below 30 + [1, 2, 3, 5, 7, 8, 11, 12, 13, 16, 17, 18, 19, 20, 23, 24, 27, 28, 29] + |> Enum.each(fn x -> + assert Server.semiprime(x) == nil + end) + end end end |