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
ZnJvbSBpdGVydG9vbHMgaW1wb3J0IGl6aXBfbG9uZ2VzdCwgY2hhaW4KCnJvdGF0ZV9jdyA9IGxhbWJkYSBhcnI6IFtsaXN0KHJvdykgZm9yIHJvdyBpbiBpemlwX2xvbmdlc3QoKmFycls6Oi0xXSldCnJvdGF0ZV9jY3cgPSBsYW1iZGEgYXJyOiBbbGlzdChyb3cpIGZvciByb3cgaW4gaXppcF9sb25nZXN0KCphcnIpXVs6Oi0xXQoKZGVmIF9wcmludF9zcGlyYWwoYXJyLCBuKToKICAgIGVsZW1fdGVtcGxhdGUgPSAne3s6Pnt9fX0nLmZvcm1hdChsZW4oc3RyKG4qbikpKQogICAgcm93X3RlbXBsYXRlID0gJyAnLmpvaW4oW2VsZW1fdGVtcGxhdGVdICogbikKICAgIHNwaXJhbF90ZW1wbGF0ZSA9ICdcbicuam9pbihbcm93X3RlbXBsYXRlXSAqIG4pCiAgICBwcmludCBzcGlyYWxfdGVtcGxhdGUuZm9ybWF0KCpjaGFpbigqYXJyKSkKCmRlZiBfZ2VuX3NwaXJhbChuLCBjdyk6CiAgICBhcnIsIHZhbHVlcyA9IFtbbipuXV0sIHJhbmdlKG4qbi0xLCAwLCAtMSkKICAgIHJvdGF0ZSA9IHJvdGF0ZV9jdyBpZiBjdyBlbHNlIHJvdGF0ZV9jY3cKICAgIHdoaWxlIHZhbHVlczoKICAgICAgICBtID0gbGVuKGFyclswXSkKICAgICAgICBwYXJ0LCB2YWx1ZXMgPSB2YWx1ZXNbOm1dLCB2YWx1ZXNbbTpdCiAgICAgICAgYXJyWy1jd11bMTpdID0gcGFydAogICAgICAgIGFyciA9IHJvdGF0ZShhcnIpCiAgICByZXR1cm4gcm90YXRlKGFycikgaWYgY3cgZWxzZSBhcnIKCmRlZiBzcGlyYWwobiwgY3c9VHJ1ZSk6CiAgICBhcnIgPSBfZ2VuX3NwaXJhbChuLCBjdykKICAgIF9wcmludF9zcGlyYWwoYXJyLCBuKQoKIyBUZXN0aW5nCmZvciBuIGluICg1LCA0KToKICAgIGZvciBjdyBpbiAoVHJ1ZSwgRmFsc2UpOgogICAgICAgIHByaW50ICd7fSB7fWNsb2Nrd2lzZTonLmZvcm1hdChuLCAnY291bnRlci0nICogKG5vdCBjdykpCiAgICAgICAgc3BpcmFsKG4sIGN3KQogICAgICAgIHByaW50