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

Tell us what’s happening:

it’s not working, I have shifted the nested loops of the if statement from move to allowed to move function.

Your code so far

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

# User Editable Region

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

            # display our progress
    

def move(n, source, auxiliary, target):
    # display starting configuration
    print(rods)
    for i in range(number_of_moves):
        remainder = (i + 1) % 3
      

# 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/123.0.0.0 Safari/537.36

Challenge Information:

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

I think you interpreted the request a bit different that what it expected.

The request says:

Move the code nested inside the first if statement (except the first print() call) to your new function. Pay close attention to the indentation. Don’t forget to remove the pass keyword.

It points to you to move the content from the first if, but not the if itself. In fact, you should leave, also, the first print() behind. In other words start moving from forward = False on.
The indentation warning is real. You also have an indentation problem here:

        if forward:
        print(f'Moving disk {rods[source][-1]} from {source} to {target}')
            rods[target].append(rods[source].pop())

I just want to ask a simple question related to this part. Shouldn’t we have -1 inside the pop. To delete the last one from the source?

I mean should not we update it the following way:
rods[target].append(rods[source].pop(-1))

At this point in the exercise step the original code given was:

if forward:
        print(f'Moving disk {rods[source][-1]} from {source} to {target}')
        rods[target].append(rods[source].pop())

And the step does not ask for any modification other that to move that portion as part of the code to another location. Therefore, for the purpose of the exercise, you do not have to spend logic in the actual code.
If you are questioning the logic behind that statement, then you have to start from the assumption that it is correct until now.

1 Like

pop() removes the last element by default, so you don’t need to pass -1. It would have the same effect.

2 Likes