Skip to content

Instantly share code, notes, and snippets.

@tusqasi
Created September 14, 2022 15:53
Show Gist options
  • Save tusqasi/3f39ca157fb9730dbaa263e3322c4673 to your computer and use it in GitHub Desktop.
Save tusqasi/3f39ca157fb9730dbaa263e3322c4673 to your computer and use it in GitHub Desktop.
A prime process with client
# Run with
# $ iex primes.ex
# > Client.start
defmodule Primes do
def is_prime(n) when n == 2 or n == 1 do
true
end
def is_prime(n) when n > 2 do
is_prime(n, n - 1)
end
def is_prime(_n, 1) do
true
end
def is_prime(n, l) when rem(n, l) == 0 do
false
end
def is_prime(n, l) do
is_prime(n, l - 1)
end
def primes_till(n) do
Enum.reduce(2..n, [], fn x, acc ->
if is_prime(x) do
[x | acc]
else
acc
end
end)
end
# def nth_prime(n) do
#
# end
def nth_prime(n, h \\ 1, p \\ 2) do
if h <= n do
if Primes.is_prime(p) do
nth_prime(n, h + 1, p)
end
else
nth_prime(n, h, p + 1)
end
end
def find_factors(n) do
cond do
rem(n, n - 1) == 0 -> find_factors(n, n - 1, [n - 1])
rem(n, n - 1) != 0 -> find_factors(n, n - 1)
end
end
def find_factors(n, l) do
if rem(n, l - 1) == 0 do
find_factors(n, l - 1, [l - 1])
else
find_factors(n, l - 1)
end
end
def find_factors(n, l, facs) do
cond do
l - 1 <= 1 -> facs
rem(n, l - 1) == 0 -> find_factors(n, l - 1, [l - 1 | facs])
true -> find_factors(n, l - 1, facs)
end
end
end
defmodule PrimeServer do
def take_num() do
IO.puts("Prime Server waiting for message")
receive do
{pid, :primes_till, n} -> send(pid, {:mes, Primes.primes_till(n), n})
{pid, :is_prime, n} -> send(pid, {:mes, Primes.is_prime(n), n})
{pid, :nth_prime, n} -> send(pid, {:mes, Primes.nth_prime(n), n})
{pid, d} -> send(pid, {:error, "Found #{d}"})
end
take_num()
end
end
defmodule Client do
def start() do
spawn(fn -> PrimeServer.take_num() end)
|> Client.start()
end
def start(pid) do
IO.puts("Select operation")
IO.puts("1. primes till")
IO.puts("2. if prime")
IO.puts("3. nth prime")
IO.write("> ")
IO.read(:stdio, :line)
|> String.trim()
|> case do
"1" ->
IO.puts("primes till")
IO.write("> ")
IO.read(:stdio, :line)
|> String.trim()
|> String.to_integer()
|> (&send(pid, {self(), :primes_till, &1})).()
IO.puts("waiting")
receive do
{:mes, mes, n} ->
IO.puts("primes till #{n}")
IO.inspect(mes)
after
2_000 -> IO.puts("no message")
end
"2" ->
IO.puts("is prime?")
IO.write("> ")
IO.read(:stdio, :line)
|> String.trim()
|> String.to_integer()
|> (&send(pid, {self(), :is_prime, &1})).()
receive do
{:mes, mes, n} ->
if mes do
IO.puts("'#{n}' is a prime number")
else
IO.puts("'#{n}' is not a prime number")
end
IO.puts("")
end
"3" ->
IO.puts("nth prime")
IO.write("> ")
IO.read(:stdio, :line)
|> String.trim()
|> String.to_integer()
|> (&send(pid, {self(), :nth_prime, &1})).()
IO.puts("waiting")
receive do
{:mes, mes, n} ->
IO.puts("#{n}th prime is #{mes}")
{:error, mes} ->
IO.puts(mes)
after
2_000 -> IO.puts("no message")
end
x ->
IO.puts("whaat")
IO.inspect(x)
end
Client.start(pid)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment