0

# Generators isPrime

Hi all, I am stuck on this problem. I pass all the test casey but the last one. I thought it was a problem of order of the input values but still I don't understand what to change. Any ideas? Below is my code: def isPrime(x): if x < 2: return False elif x == 2: return True for n in range(2, x): if x % n ==0: return False return True def primeGenerator(a, b): #your code goes here for i in range(a,b+1): if isPrime (i)== True: yield i for i in range (b, a+1): if isPrime (i) == True: yield i f = int(input()) t = int(input()) print(list(primeGenerator(f, t))) Cheers

14 ответов

+ 2

Brassac The only other special case I can think of right now is when the bounds themselves are prime numbers. So I don't know if "between the two arguments" includes the arguments or not. So for 4, 7 should the program output 7 or not? Same for the lower bound. You should try if changing the handling of the arguments solves the last test case.

+ 2

Hi Calvin Thomas I guess my question title was misleading, the problem is not in the isPrime function which is already given but in the primeGenerator function.
Anyhow thanks for the suggestion, I guess it's always a good thing to read alternative ways to code.

+ 1

Brassac If you want to fix the problem just remove the second for loop and change the first range to range(min(a,b), max(a,b)+1)

0

In primeGenerator if a == b and a is prime you yield it twice. For example primeGenerator (3,3) will yield 3 twice.

0

Here's a simpler version of your is_prime function:
def is_prime(x):
if x == 2: return True
if x < 2 or x % 2 < 1: return False
return all(x % i for i in range(3, x, 2))
# Hope this helps

0

Hi Hape
sorry but I am not sure to understand why if a==b and a is prime, the function should yield a twice because the function anyway makes b+1.

0

Brassac The first for loop iterates i from a to b inclusive and the second one from b to a inclusive. I think you were trying to compensate for the fact that you don't know which of a and b is greater. But this leads in the special case of a==b to both for loops beginning and ending with that number so that both loops encounter a. And if a is a prime both loops will yield it.

0

Brassac I could try to help, if you could explain what the generator function should do.

0

Hape that's a nice way to do it (I had tried if, elif statements that achieved the same thing but way longer) but still I am missing something because the last test case is still wrong.

0

Brassac could you please share the exact code you have right now? I can't think of anything else that could be wrong right now. It would also be helpful if you could write what the exact definition of the task you are trying to solve is.

0

Finding prime numbers is a common coding interview task.
The given code defines a function isPrime(x), which returns True if x is prime.
You need to create a generator function primeGenerator(), that will take two numbers as arguments, and use the isPrime() function to output the prime numbers in the given range (between the two arguments).
Sample Input:
10
20
Sample Output:
[11, 13, 17, 19]
And here is my current code.
As already mentioned, it solves all test cases but the last one which is hidden. I still don't understand what special case this could be.
https://code.sololearn.com/cq4y6LvEo4l1/?ref=app

0

Hape thanks for the suggestion, that solved the problem. I guess that everything was mentioned in the comment "between the two arguments".

0

Brassac Here's a more optimized version:
https://code.sololearn.com/cbSIAk85ThDy/?ref=app

0

Simply remove the one you are adding to the other input
def isPrime(x):
if x < 2:
return False
elif x == 2:
return True
for n in range(2, x):
if x % n ==0:
return False
return True
def primeGenerator(a, b):
#your code goes here
for i in range(a,b):
if isPrime (i)== True:
yield i
for i in range (b, a):
if isPrime (i) == True:
yield i
f = int(input())
t = int(input())
print(list(primeGenerator(f, t)))