euler28.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. def print_arr(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 spiral_fill(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. i_order = 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[i_order]
  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 i_order == 1 or i_order == 3:
  28. length += 1
  29. i_order = (i_order+1) % 4
  30. return a
  31. def diagonal_sum(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 = spiral_fill(array)
  48. if args.d:
  49. print_arr(array)
  50. print diagonal_sum(array)