Back to Freecodecamp

Step 27

curriculum/challenges/english/blocks/learn-recursion-by-solving-the-tower-of-hanoi-puzzle/64ddce6f6e8066173208235b.md

latest2.2 KB
Original Source

--description--

When forward is False, the disk has to be moved in the opposite direction. Write an else clause for that. Print the move and change the content of the lists accordingly.

--hints--

You should have an else clause to move the disks in the opposite direction.

js
({ test: () => assert.match(code, /rods\s*\[\s*target\s*\]\s*\.append\s*\(\s*rods\s*\[\s*source\s*\]\s*\.pop\s*\(\s*\)\s*\)\s+else\s*:/) })

You should have print(f'Moving disk {rods[target][-1]} from {target} to {source}') inside your else clause.

js
({ test: () => assert.match(code, /else\s*:\s+print\s*\(\s*f('|")Moving\sdisk\s\{\s*rods\s*\[\s*target\s*\]\s*\[\s*-\s*1\s*\]\s*\}\sfrom\s\{\s*target\s*\}\sto\s\{\s*source\s*\}\1\s*\)/) })

You should remove the last element from rods[target].

js
({ test: () => assert.match(code, /rods\s*\[\s*target\s*\]\s*\.pop\s*\(\s*\)/) })

You should have rods[source].append(rods[target].pop()) in your code.

js
({ test: () => assert.match(code, /rods\s*\[\s*source\s*\]\s*\.append\s*\(\s*rods\s*\[\s*target\s*\]\s*\.pop\s*\(\s*\)\s*\)/) })

--seed--

--seed-contents--

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

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}')
            forward = False
            if not rods[target]:
                forward = True
            elif rods[source] and rods[source][-1] < rods[target][-1]:
                forward = True
--fcc-editable-region--                
            if forward:
                print(f'Moving disk {rods[source][-1]} from {source} to {target}')
                rods[target].append(rods[source].pop())
--fcc-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')