Created
September 14, 2022 15:53
-
-
Save tusqasi/3f39ca157fb9730dbaa263e3322c4673 to your computer and use it in GitHub Desktop.
A prime process with client
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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