Esempio n. 1
0
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))
Esempio n. 2
0
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))