view stacks_lists/pancakes/pancakes.py @ 0:20fea762903e

Import some exercises and solutions
author Louis Opter <kalessin@kalessin.fr>
date Sat, 29 Jun 2013 19:30:31 -0700
parents
children
line wrap: on
line source

#!/usr/bin/env python


def flip_pancakes(pancakes, index):
    print(
        "{0} → flip at {1} ({2}) (biggest_sorted={3}, biggest_unsorted={4}) → ".format(
            pancakes, index, pancakes[index], pancakes[find_biggest_sorted(pancakes)], pancakes[find_biggest_unsorted(pancakes)]
        ),
        end=""
    )
    for i in range(int((index + 1) / 2)):
        tmp = pancakes[index - i]
        pancakes[index - i] = pancakes[i]
        pancakes[i] = tmp
    print("{0}".format(pancakes))


def is_sorted(pancakes):
    for i in range(1, len(pancakes)):
        if pancakes[i - 1] > pancakes[i]:
            return False
    return True


def find_biggest(pancakes):
    biggest = pancakes[0]
    biggest_idx = 0
    for i in range(1, len(pancakes)):
        if pancakes[i] > biggest:
            biggest = pancakes[i]
            biggest_idx = i
    return biggest_idx


def find_biggest_sorted(pancakes):
    for i in reversed(range(1, len(pancakes))):
        if i != find_biggest(pancakes[:i + 1]):
            return i
    return 0


def find_biggest_unsorted(pancakes):
    biggest = pancakes[0]
    biggest_idx = 0
    for i in range(1, find_biggest_sorted(pancakes) + 1):
        if pancakes[i] > biggest:
            biggest = pancakes[i]
            biggest_idx = i
    return biggest_idx


def sort_pancakes(pancakes):
    while not is_sorted(pancakes):
        biggest_unsorted = find_biggest_unsorted(pancakes)
        flip_pancakes(pancakes, biggest_unsorted)
        biggest_sorted = find_biggest_sorted(pancakes)
        flip_pancakes(pancakes, biggest_sorted)
        biggest_unsorted = find_biggest_unsorted(pancakes)


if __name__ == "__main__":
    sort_pancakes([7, 5, 4, 8, 2, 1])