euler28.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. def printArr(a):
  4. for line in a:
  5. print(line)
  6. def initialise(n):
  7. array = [[0 for j in xrange(0,n)] for i in xrange(0,n)]
  8. return array
  9. def spiralFill(a):
  10. n = len(a)
  11. x = y = n/2
  12. number = 1
  13. # r u l o
  14. order = [(1,0), (0,1), (-1,0), (0,-1)]
  15. iOrder = 0
  16. length = 1
  17. a[y][x] = number
  18. while not (x == (n-1) and y == 0):
  19. for j in xrange(0, length):
  20. xAdd, yAdd = order[iOrder]
  21. x += xAdd
  22. y += yAdd
  23. number += 1
  24. a[y][x] = number
  25. if x == (n-1) and y==0:
  26. break
  27. if iOrder == 1 or iOrder == 3:
  28. length += 1
  29. iOrder = (iOrder+1) % 4
  30. return a
  31. def diagonalSum(a):
  32. n = len(a)
  33. sum = -1 # you will have the element in the middle (1) twice
  34. for i in xrange(0, n):
  35. sum += a[i][i]
  36. sum += a[n-i-1][i]
  37. return sum
  38. if __name__ == "__main__":
  39. import argparse
  40. parser = argparse.ArgumentParser(description="ProjectEuler: 28")
  41. parser.add_argument("-n", metavar='N', type=int,
  42. help="length of the spiral", required=True)
  43. parser.add_argument("-d", action="store_true",default=False,
  44. help="display the spiral")
  45. args = parser.parse_args()
  46. array = initialise(args.n)
  47. array = spiralFill(array)
  48. if args.d:
  49. printArr(array)
  50. print diagonalSum(array)