def make_smooth_hanoi(size): if size > 6: raise Exception("ImageMagick cannot generate a gif of size {}".format(size)) def state_diff(prev, cur): """ identifies which ring has moved between the two states, and its source/dest. returns a (size, source, dest) tuple. """ size = None for i in range(3): if len(prev[i]) < len(cur[i]): dest = i elif len(prev[i]) > len(cur[i]): source = i size = prev[i][-1] if size == None: raise Exception("No difference detected between states {} and {}".format(prev, cur)) return (size, source, dest) imgs = [] prev = None for state in hanoi.iter_hanoi_state(0, 2, 1, size): if prev: # create transition between prev and state assert sum(len(tower) for tower in prev.values()) == size, "expected prev of size {}, got {}".format( size, prev ) free_ring, source, dest = state_diff(prev, state) prev[source].pop() for frac in frange(0, 1, 32): imgs.append(make_img(prev.values(), free_ring, source, dest, frac)) imgs.append(make_img(state.values())) prev = state for i in range(10): imgs.append(imgs[-1]) imgs = add_progress_bar(imgs) animation.make_gif(imgs, delay=2, name="smooth_hanoi_{}.gif".format(size))
def make_hanoi(size): size = 5 imgs = [make_img(state.values()) for state in hanoi.iter_hanoi_state(0, 2, 1, size)] animation.make_gif(imgs, delay=15, name="hanoi_{}.gif".format(size))