Prime Pathing Help Python

Code
# Get all your troops to the end of the path by passing over the mines.
# You can locate duds by finding the mines that have a value that is a prime number.
# Check the guide for clarification.

while True:
    traps = hero.findByType("fire-trap")
    trapsIndex = 0
    for trap in traps:
        trap = trap[trapsIndex]
        trap.value = value
        for i in range(2, Math.ceil(Math.sqrt(value))):
            if n % i == 0:
                hero.move(trap.pos)
            else:
                trapsIndex += 1

I get an error message that I can’t write a property of a non-object type which is value. It’s on the line trap.value = value. Any help someone can give me?

link link @CryptiCrystal

Oh sorry mb. https://codecombat.com/play/level/prime-pathing

You don’t need a link - type this in the URL field of the browser
image
then copy the highlighted piece taken from the URL of the topic
image
and form the URL of the level
image

@CryptiCrystal : I didn’t test the code but

trap.value = value # value = trap.value ?
1 Like

Ah. I’m not great…but either way doesn’t work

You have to get your method straight.
Are you using for trap in traps or traps[trapsIndex]. At the moment you’ve got for trap in traps, which defines trap, but for some reason you’re also defining trap as trap[trapsIndex]. That’s incorrect because trap isn’t an array, that’s traps.
Also what is n? have you defined it?
Danny

Ok so I now have

# Get all your troops to the end of the path by passing over the mines.
# You can locate duds by finding the mines that have a value that is a prime number.
# Check the guide for clarification.

while True:
    traps = hero.findByType("fire-trap")
    trapsIndex = 0
    for trap in traps:
        value = trap.value
        for i in range(2, Math.ceil(Math.sqrt(value))):
            if value % i == 0:
                hero.moveXY(hero.pos.x, trap.pos.y)
                hero.move(trap.pos)
            else:
                continue

But now it just runs into any trap

Well now I’ve changed it a little more and now have

# Get all your troops to the end of the path by passing over the mines.
# You can locate duds by finding the mines that have a value that is a prime number.
# Check the guide for clarification.

while True:
    traps = hero.findByType("fire-trap")
    for trap in traps:
        value = trap.value
        for i in range(2, Math.ceil(Math.sqrt(value))):
            if value % i == 0:
                hero.moveXY(trap.pos.x + 10, trap.pos.y)
                hero.move(trap.pos)
            else:
                i += 1

Hi CryptiCrystal,

This is quite a hard level - it took me a lot of attempts to get through it. A couple of things to get you started:

At the moment you’re finding all of the fire-traps (or at least all the ones in range of your glasses). Is that what you want?

You’re on the right lines for how to find a prime number. But think carefully about what “if value % i == 0” actually means. Is value a prime number if this is true?
I made the ‘check if a number is prime’ into a function, so it could all run before my hero took any action.

Try getting these things sorted so your hero can get through the first set of fire-traps. Once you have the basics working there will then be some more problems to solve.

Good luck!

Jenny

oh wait (facepalms) it shows that value % i == 0 shows if it is not prime, ok ty.

# Get all your troops to the end of the path by passing over the mines.
# You can locate duds by finding the mines that have a value that is a prime number.
# Check the guide for clarification.

def isItPrime(number):
    for i in range(2, Math.ceil(Math.sqrt(number))):
        if number % i != 0:
            return True
        else:
            i += 1

while True:
    traps = hero.findNearest(hero.findByType("fire-trap"))
    for trap in traps:
        value = trap.value
        isItPrime(value)
        if isItPrime(value) == True:
            hero.move(trap.pos)
        else:
            pass

I don’t see what you mean by finding all of the fire-traps. Would I have to see the ones that closest, like in the code up there ^^^ with hero.findNearest(hero.findByType("fire-trap")) AND I have a infinite loop. I know that I have to command the troops, but I don’t want to worry about that yet.

I also have a Statement Execution Limit Reached on line 6: for i in range(2, Math.ceil(Math.sqrt(number))):

Have another look at your isItPrime function. You’re thinking on the right lines, but what happens if you put 15 into the function? i starts at 2; and 15 % 2 = 1, which doesn’t equal 0; so the function returns True. Is that right?

I don’t think you want the i += 1 in there as the for loop will increase i each time - I suspect this is what is causing the errors.

In terms of finding the closest fire-traps, you could just restrict them by distance…

Keep going with it - you sound as though you’ve got a structure and you’re working through each problem as you come to it (which seem to be the key to programming).

Jenny

#Commented out to stop infinite loop.
# Get all your troops to the end of the path by passing over the mines.
# You can locate duds by finding the mines that have a value that is a prime number.
# Check the guide for clarification.

def isItPrime(number):
    for i in range(2, number):
        if number % i != 0:
            return True

while True:
    traps = hero.findNearest(hero.findByType("fire-trap"))
    for trap in traps:
        if trap:
            value = trap.value
            isItPrime(value)
            if isItPrime(value) == True:
                hero.move(trap.pos)
        else:
            continue

hmmmm, now it says that in trap.pos, trap is not defined

try putting traps in

??? Confused (I don’t like 20 chars)

try this hero.move(traps.pos)

but then that’s an array, not an object

visualizing your isItPrime function:

numbs = [77, 3, 11, 21, 42, 55, 51]
def isItPrime(number):
    for i in range(2, number):
        if number % i != 0:
            print( str(i) + " " + str(number) + " " + str(number % i))
            return True
for num in numbs:
    if isItPrime(num):
        print(num)  
# shorturl.at/mxHL4 shortcut from http://www.pythontutor.com


So you must write a better isItPrime() function or find one in internet ( and there is nothing wrong doing it :slight_smile:
Shotrcut where the code can be run http://shorturl.at/mxHL4
P.S. For years I check snippets of codecombat code in http://www.pythontutor.com

3 Likes

Ok. I found a different one on the web :smiley:.But, now it’s the moving part. I don’t move anywhere. Here I’ll show it again.

Code
#Commented out to stop infinite loop.
# Get all your troops to the end of the path by passing over the mines.
# You can locate duds by finding the mines that have a value that is a prime number.
# Check the guide for clarification.

def isItPrime(n):
    if n <= 1 or n % 1 > 0:
        isPrime = False
    for i in range(2, n/2):
        if n % i == 0:
            isPrime = False
            return False
        else:
            isPrime = True
            return True
while True:
    traps = hero.findNearest(hero.findByType("fire-trap"))
    for trap in traps:
        if trap:
            value = trap.value
            isItPrime(value)
            if isItPrime(value) == True:
                hero.move(trap.pos)
            else:
                continue
1 Like