Skip to content

Commit 5e39d1d

Browse files
authoredNov 25, 2020
Merge pull request #4 from adolfont/main
Incorporação código Cristine sobre Primos em sequência.
2 parents 9123a2f + 0b5df94 commit 5e39d1d

File tree

2 files changed

+101
-4
lines changed

2 files changed

+101
-4
lines changed
 

‎lib/primos_em_pi.ex

+65-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ defmodule PrimosEmPi do
33
num
44
|> clean
55

6-
4159265358979323
6+
4_159_265_358_979_323
77
end
88

99
def clean(num) do
@@ -14,9 +14,71 @@ defmodule PrimosEmPi do
1414
|> Enum.map(&String.to_integer(&1))
1515
end
1616

17+
# def is_prime?(n) when n in [2, 3], do: true
18+
19+
# def is_prime?(x) do
20+
# 2..floor(:math.sqrt(x)) |> Enum.all?(fn y -> rem(x, y) != 0 end)
21+
# end
22+
23+
# Código Cristine
24+
25+
@max_digits_constant 4
26+
27+
def biggest_prime(numbers) do
28+
numbers
29+
|> Enum.join()
30+
|> do_biggest_prime(max_digits(numbers))
31+
end
32+
33+
def do_biggest_prime(numbers_as_string, max_digits) do
34+
numbers_as_string
35+
|> slices(max_digits)
36+
# |> Enum.sort(fn x, y -> String.to_integer(x) > String.to_integer(y) end)
37+
|> check(numbers_as_string, max_digits)
38+
end
39+
40+
def check(slices, numbers, max_digits) do
41+
slices
42+
|> Enum.filter(&is_prime?/1)
43+
|> primes(numbers, max_digits)
44+
end
45+
46+
def primes([], _numbers, 1) do
47+
:error
48+
end
49+
50+
def primes([], numbers, acc) do
51+
numbers
52+
|> do_biggest_prime(acc - 1)
53+
end
54+
55+
def primes(primes, _numbers, _acc) do
56+
primes
57+
|> Enum.map(&String.to_integer/1)
58+
|> Enum.max()
59+
end
60+
61+
def is_prime?(n) when is_binary(n), do: is_prime?(String.to_integer(n))
1762
def is_prime?(n) when n in [2, 3], do: true
1863

19-
def is_prime?(x) do
20-
2..floor(:math.sqrt(x)) |> Enum.all?(fn y -> rem(x, y) != 0 end)
64+
def is_prime?(n) when n <= 9973 do
65+
Enum.to_list(2..floor(:math.sqrt(n)))
66+
|> calc(n)
2167
end
68+
69+
def is_prime?(_n), do: false
70+
71+
def calc([h | _t], n) when rem(n, h) == 0, do: false
72+
def calc([_h | t], n), do: calc(t, n)
73+
def calc([], _n), do: true
74+
75+
def slices(_, size) when size <= 0, do: []
76+
77+
def slices(s, size) do
78+
max = String.length(s)
79+
for iterate <- 0..max, iterate + size <= max, do: String.slice(s, iterate, size)
80+
end
81+
82+
def max_digits(numbers) when length(numbers) < @max_digits_constant, do: length(numbers)
83+
def max_digits(_), do: @max_digits_constant
2284
end

‎test/primos_em_pi_test.exs

+36-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ defmodule PrimosEmPiTest do
22
use ExUnit.Case
33

44
test "initial sequence" do
5-
assert PrimosEmPi.sequence(3.14159265358979323846) == 4159265358979323
5+
assert PrimosEmPi.sequence(3.14159265358979323846) == 4_159_265_358_979_323
66
end
77

88
test "clean" do
@@ -31,4 +31,39 @@ defmodule PrimosEmPiTest do
3131
refute(PrimosEmPi.is_prime?(4))
3232
assert(PrimosEmPi.is_prime?(5))
3333
end
34+
35+
test "Return if a number is prime" do
36+
assert PrimosEmPi.is_prime?(2)
37+
assert PrimosEmPi.is_prime?(3)
38+
assert PrimosEmPi.is_prime?(5)
39+
assert PrimosEmPi.is_prime?(59)
40+
assert PrimosEmPi.is_prime?(653)
41+
assert PrimosEmPi.is_prime?(9323)
42+
43+
refute PrimosEmPi.is_prime?(6)
44+
refute PrimosEmPi.is_prime?(6598)
45+
refute PrimosEmPi.is_prime?(8541)
46+
refute PrimosEmPi.is_prime?(85)
47+
end
48+
49+
test "Return if a string that represents a number is a prime number" do
50+
assert PrimosEmPi.is_prime?("653")
51+
assert PrimosEmPi.is_prime?("3")
52+
53+
assert_raise ArgumentError, fn ->
54+
PrimosEmPi.is_prime?("A")
55+
end
56+
end
57+
58+
test "Return the biggest prime number from a given list" do
59+
assert PrimosEmPi.biggest_prime([4, 4, 4, 4, 4]) == :error
60+
assert PrimosEmPi.biggest_prime([1, 2, 2, 2, 2]) == 2
61+
assert PrimosEmPi.biggest_prime([3, 1, 4, 1, 5]) == 41
62+
assert PrimosEmPi.biggest_prime([5, 9, 2, 6, 5]) == 59
63+
assert PrimosEmPi.biggest_prime([2, 6, 5, 3, 5]) == 653
64+
assert PrimosEmPi.biggest_prime([7, 9, 3, 2, 3]) == 9323
65+
66+
assert PrimosEmPi.biggest_prime([1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3, 2, 3, 8, 4, 6]) ==
67+
9323
68+
end
3469
end

0 commit comments

Comments
 (0)
Please sign in to comment.