curriculum/challenges/english/blocks/learn-recursion-by-solving-the-tower-of-hanoi-puzzle/64ddce6f6e8066173208235b.md
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.
You should have an else clause to move the disks in the opposite direction.
({ 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.
({ 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].
({ 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.
({ test: () => assert.match(code, /rods\s*\[\s*source\s*\]\s*\.append\s*\(\s*rods\s*\[\s*target\s*\]\s*\.pop\s*\(\s*\)\s*\)/) })
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')