about summary refs log tree commit diff
path: root/assessments
diff options
context:
space:
mode:
Diffstat (limited to 'assessments')
-rw-r--r--assessments/semiprimes/server/lib/server.ex29
-rw-r--r--assessments/semiprimes/server/test/server_test.exs29
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