Solution: Tower of Hanoi



examples/functions/tower_recursive.py
def check():
    for loc in hanoi.keys():
        if hanoi[loc] != sorted(hanoi[loc], reverse=True):
            raise Exception(f"Incorrect order in {loc}: {hanoi[loc]}")

def move(depth, source, target, helper):
    if depth > 0:
        move(depth-1, source, helper, target)

        val = hanoi[source].pop()
        hanoi[target].append(val)
        print(f"Move {val} from {source} to {target}   Status A:{str(hanoi['A']):10}  B:{str(hanoi['B']):10}  C:{str(hanoi['C']):10}")
        check()

        move(depth-1, helper, target, source)
    check()

hanoi = {
    'A': [4, 3, 2, 1],
    'B': [],
    'C': [],
}

check()
move(len(hanoi['A']), 'A', 'C', 'B')
check()

examples/functions/tower.py
def check():
    for loc in ['A', 'B', 'C']:
        print(f"{loc} {hanoi[loc]}", end=' ')
        if hanoi[loc] != sorted(hanoi[loc], reverse=True):
            raise Exception(f"Incorrect order in {loc}: {hanoi[loc]}")
    print('')

def move(source, target, helper):
    #if not hanoi[source]:
    #    return
    if len(hanoi[source]) == 1:
        disk = hanoi[source].pop()
        print(f"Move {disk} from {source} to {target}")
        hanoi[target].append(disk)
        return
    big_disk = hanoi[source].pop(0)   # pretend the biggest disk is not there
    move(source, helper, target)
    print(f"Move {big_disk} from {source} to {target}")
    move(helper, target, source)
    hanoi[target].insert(0, big_disk) # stop pretending
    check()


hanoi = {
    'A': [4, 3, 2, 1],
    'B': [],
    'C': [],
}

check()
move('A', 'C', 'B')
check()