-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSteps in Primes.cs
63 lines (46 loc) · 2.58 KB
/
Steps in Primes.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*
Difficulty: 6kyu
URL: https://www.codewars.com/kata/steps-in-primes
Notes: TODO Works for some test cases not all
Description: The prime numbers are not regularly spaced. For example from 2 to 3 the step is 1. From 3 to 5 the step is 2. From 7 to 11 it is 4. Between 2 and 50 we have the following pairs of 2-steps primes:
3, 5 - 5, 7, - 11, 13, - 17, 19, - 29, 31, - 41, 43
We will write a function step with parameters:
* g (integer >= 2) which indicates the step we are looking for,
* m (integer >= 2) which gives the start of the search (m inclusive),
* n (integer >= m) which gives the end of the search (n inclusive)
In the example above step(2, 2, 50) will return [3, 5] which is the first pair between 2 and 50 with a 2-steps.
So this function should return the first pair of the two prime numbers spaced with a step of g between the limits m, n if these g-steps prime numbers exist otherwise nil or null or None or Nothing or [] or "0, 0" or {0, 0} (depending on the language).
#Examples:
step(2, 5, 7) --> [5, 7] or (5, 7) or {5, 7} or "5 7"
step(2, 5, 5) --> nil or ... or [] in Ocaml or {0, 0} in C++
step(4, 130, 200) --> [163, 167] or (163, 167) or {163, 167}
See more examples for your language in "RUN"
Remarks:
([193, 197] is also such a 2-steps primes between 130 and 200 but it's not the first pair).
step(6, 100, 110) --> [101, 107] though there is a prime between 101 and 107 which is 103; the pair 101-103 is a 2-step.
#Notes: The idea of "step" is close to that of "gap" but it is not exactly the same. For those interested they can have a look at http://mathworld.wolfram.com/PrimeGaps.html.
A "gap" is more restrictive: there must be no primes in between (101-107 is a "step" but not a "gap". Next kata will be about "gaps":-).
For Go: nil slice is expected when there are no step between m and n. Example: step(2,4900,4919) --> nil
*/
public IList<int> GeneratePrimes(int m, int n)
{
return Range(m, n)
.Where(x => Range(2, (int)Math.Sqrt(x)).All(y => x % y != 0))
.ToList();
}
public IEnumerable<int> Range(int from, int to)
{
for (int i = from; i <= to; i++) yield return i;
}
public string step(int g, int m, int n)
{
if (g < 2 || m < 2 || n < m)
return "{0 0}";
var listOfPrimes = GeneratePrimes(m, n);
var groups = Enumerable.Range(0, listOfPrimes.Count - 1)
.Select(x => new { a = listOfPrimes[x], b = listOfPrimes[x+1]})
.FirstOrDefault(x => x.b - x.a == g);
if(groups == null)
return "{0 0}";
return $"{{{groups.a}, {groups.b}}}";
}