Advertisement
Guest User

Untitled

a guest
Feb 27th, 2015
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.19 KB | None | 0 0
  1. """
  2. Outputs the closest square spiral matrix of an input number
  3. """
  4. from math import sqrt
  5.  
  6.  
  7. def is_even_square(num):
  8. """True if an integer is even as well as a perfect square"""
  9. return sqrt(num).is_integer() and (num % 2 == 0)
  10.  
  11.  
  12. def find_nearest_square(num):
  13. """Returns the nearest even perfect square to a given integer"""
  14. for i in range(num):
  15. if is_even_square(num - i):
  16. return num - i
  17. elif is_even_square(num + i):
  18. return num + i
  19.  
  20.  
  21. def find_lower_squares(num):
  22. """Returns a list of even perfect squares less than a given integer"""
  23. squares = []
  24. for i in range(num, 3, -1):
  25. if is_even_square(i): squares.append(i)
  26. return squares
  27.  
  28.  
  29. def nth_row(num, n):
  30. """Returns the nth row of the square spiral matrix"""
  31. edge = int(sqrt(num))
  32. squares = find_lower_squares(num)
  33. if n == 0:
  34. return list(range(num, num - edge, -1))
  35. elif n >= edge - 1:
  36. return list(range(num - 3*edge + 3, num - 2*edge + 3))
  37. elif n < edge // 2:
  38. return ([squares[1] + n] + nth_row(squares[1],n-1)
  39. + [num - edge - n + 1])
  40. else:
  41. return ([num - 3*edge + 4 + n - edge] + nth_row(squares[1],n-1)
  42. + [num - 2*edge + 1 - n + edge])
  43.  
  44.  
  45. def generate_square_spiral(num):
  46. """Generates a square spiral matrix from a given integer"""
  47. edge = int(sqrt(num))
  48. square_spiral = [[None for x in range(edge)] for y in range(edge)]
  49. for row in range(edge): square_spiral[row] = nth_row(num, row)
  50. return square_spiral
  51.  
  52.  
  53. def main ():
  54. num = None
  55. while not num:
  56. try:
  57. num = int(input('Input number: '))
  58. except ValueError:
  59. print('Invalid Number')
  60. nearest_square = find_nearest_square(num)
  61. matrix = generate_square_spiral(nearest_square)
  62. for row in range(len(matrix[0])):
  63. for col in range(len(matrix)):
  64. if matrix[row][col] < 10:
  65. print(' ',matrix[row][col],' ',sep='',end='')
  66. elif matrix[row][col] < 100:
  67. print(' ',matrix[row][col],' ',sep='',end='')
  68. else:
  69. print(matrix[row][col],' ',sep='',end='')
  70. print(2*"n",end='')
  71.  
  72. if __name__ == '__main__':
  73. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement