from itertools import izip_longest, chain

rotate_cw = lambda arr: [list(row) for row in izip_longest(*arr[::-1])]
rotate_ccw = lambda arr: [list(row) for row in izip_longest(*arr)][::-1]

def _print_spiral(arr, n):
    elem_template = '{{:>{}}}'.format(len(str(n*n)))
    row_template = ' '.join([elem_template] * n)
    spiral_template = '\n'.join([row_template] * n)
    print spiral_template.format(*chain(*arr))

def _gen_spiral(n, cw):
    arr, values = [[n*n]], range(n*n-1, 0, -1)
    rotate = rotate_cw if cw else rotate_ccw
    while values:
        m = len(arr[0])
        part, values = values[:m], values[m:]
        arr[-cw][1:] = part
        arr = rotate(arr)
    return rotate(arr) if cw else arr

def spiral(n, cw=True):
    arr = _gen_spiral(n, cw)
    _print_spiral(arr, n)

# Testing
for n in (5, 4):
    for cw in (True, False):
        print '{} {}clockwise:'.format(n, 'counter-' * (not cw))
        spiral(n, cw)
        print