123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- def printArr(a):
- for line in a:
- print(line)
- def initialise(n):
- array = [[0 for j in xrange(0,n)] for i in xrange(0,n)]
- return array
- def spiralFill(a):
- n = len(a)
- x = y = n/2
- number = 1
- # r u l o
- order = [(1,0), (0,1), (-1,0), (0,-1)]
- iOrder = 0
- length = 1
- a[y][x] = number
- while not (x == (n-1) and y == 0):
- for j in xrange(0, length):
- xAdd, yAdd = order[iOrder]
- x += xAdd
- y += yAdd
- number += 1
- a[y][x] = number
- if x == (n-1) and y==0:
- break
- if iOrder == 1 or iOrder == 3:
- length += 1
- iOrder = (iOrder+1) % 4
- return a
- def diagonalSum(a):
- n = len(a)
- sum = -1 # you will have the element in the middle (1) twice
- for i in xrange(0, n):
- sum += a[i][i]
- sum += a[n-i-1][i]
- return sum
- if __name__ == "__main__":
- import argparse
-
- parser = argparse.ArgumentParser(description="ProjectEuler: 28")
- parser.add_argument("-n", metavar='N', type=int,
- help="length of the spiral", required=True)
- parser.add_argument("-d", action="store_true",default=False,
- help="display the spiral")
- args = parser.parse_args()
- array = initialise(args.n)
- array = spiralFill(array)
- if args.d:
- printArr(array)
- print diagonalSum(array)
|