Learn Recursion by Solving the Tower of Hanoi Puzzle - Step 34

I have called the make_allowed_move() function but my code does not pass. I have tried calling the function in different places and I get the same result: Sorry, your code does not pass. Don't give up.
Where exactly in my code am I supposed to call this function?

NUMBER_OF_DISKS = 3
number_of_moves = 2**NUMBER_OF_DISKS - 1
rods = {
    'A': list(range(NUMBER_OF_DISKS, 0, -1)),
    'B': [],
    'C': []
}

def make_allowed_move(rod1, rod2):    
    forward = False
    if not rods[rod2]:
        forward = True
    elif rods[rod1] and rods[rod1][-1] < rods[rod2][-1]:
        forward = True              
    if forward:
        print(f'Moving disk {rods[rod1][-1]} from {rod1} to {rod2}')
        rods[rod2].append(rods[rod1].pop())
    else:
        print(f'Moving disk {rods[rod2][-1]} from {rod2} to {rod1}')
        rods[rod1].append(rods[rod2].pop())
    
    # display our progress
    print(rods)

def move(n, source, auxiliary, target):
    # display starting configuration
    print(rods)

# User Editable Region

    make_allowed_move(source, target)
    for i in range(number_of_moves):
        remainder = (i + 1) % 3
        if remainder == 1:
            print(f'Move {i + 1} allowed between {source} and {target}')
              

# User Editable Region

        elif remainder == 2:
            print(f'Move {i + 1} allowed between {source} and {auxiliary}')
        elif remainder == 0:
            print(f'Move {i + 1} allowed between {auxiliary} and {target}')            

# initiate call from source A to target C with auxiliary B
move(NUMBER_OF_DISKS, 'A', 'B', 'C')

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36

Challenge Information:

Learn Recursion by Solving the Tower of Hanoi Puzzle - Step 34

it should be called inside if statement

Hiya there Zack. At the point you’re calling it, we don’t know if the move is actually
valid or not. And typically when we print what we’re going to do in the console, we usually do them right after.

Hope this helps. :slight_smile:

Hi @aaronvincent6411 , thanks for your suggestion. I have tried calling the function inside the if statement. In the console on the right side of my screen I can see that the moves are made and printed out, but the code checker tells me that:-

Sorry, your code does not pass. Try again.

You should call `make_allowed_move()` passing `source` and `target` as the arguments.

did u pass arguments
pls share latest code update

@a2937 thanks for the tip. However could you please explain more. I don’t quite understand what you are suggesting. Thanks

NUMBER_OF_DISKS = 3
number_of_moves = 2**NUMBER_OF_DISKS - 1
rods = {
    'A': list(range(NUMBER_OF_DISKS, 0, -1)),
    'B': [],
    'C': []
}

def make_allowed_move(rod1, rod2):    
    forward = False
    if not rods[rod2]:
        forward = True
    elif rods[rod1] and rods[rod1][-1] < rods[rod2][-1]:
        forward = True              
    if forward:
        print(f'Moving disk {rods[rod1][-1]} from {rod1} to {rod2}')
        rods[rod2].append(rods[rod1].pop())
    else:
        print(f'Moving disk {rods[rod2][-1]} from {rod2} to {rod1}')
        rods[rod1].append(rods[rod2].pop())
    
    # display our progress
    print(rods)

def move(n, source, auxiliary, target):
    # display starting configuration
    print(rods)
    for i in range(number_of_moves):
        remainder = (i + 1) % 3
        if remainder == 1:
            print(f'Move {i + 1} allowed between {source} and {target}')
            
        elif remainder == 2:
            print(f'Move {i + 1} allowed between {source} and {auxiliary}')
        elif remainder == 0:
            print(f'Move {i + 1} allowed between {auxiliary} and {target}')
        make_allowed_move(source, target)            

# initiate call from source A to target C with auxiliary B
move(NUMBER_OF_DISKS, 'A', 'B', 'C')

@aaronvincent6411 I have pasted the updated code

inside if after print. u have called inside for loop. put it inside if condition

1 Like

Thanks @aaronvincent6411 . You are awesome. It is encouraging

1 Like