You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.5 KiB

  1. from math import sqrt
  2. def get_row_num(i):
  3. return int((sqrt(8 * i + 1) - 1) / 2)
  4. def get_last_whole_i(row):
  5. return (row * (row + 1)) // 2
  6. class DiagonalCounter:
  7. def __init__(self, table_size):
  8. self.table_size = table_size
  9. def diagonal(self, i):
  10. row = get_row_num(i)
  11. last_whole_i = get_last_whole_i(row)
  12. if row < self.table_size:
  13. y = i - last_whole_i
  14. x = row - y
  15. return x, y
  16. else:
  17. x, y = self.diagonal(self.table_size ** 2 - (1 + i))
  18. return self.table_size - x - 1, self.table_size - y - 1
  19. def diagonal_reversed(self, i):
  20. y, x = self.diagonal(i)
  21. return x, y
  22. def diagonal_then_reversed(self, i):
  23. row = get_row_num(i)
  24. if row > self.table_size - 1:
  25. row = get_row_num(self.table_size ** 2 - (i + 1))
  26. if row % 2 != 0:
  27. return self.diagonal(i)
  28. else:
  29. return self.diagonal_reversed(i)
  30. if __name__ == "__main__":
  31. import csv
  32. d = DiagonalCounter(6)
  33. for func in (d.diagonal, d.diagonal_reversed, d.diagonal_then_reversed):
  34. output = list(
  35. list(-1 for i in range(d.table_size)) for j in range(d.table_size)
  36. )
  37. indices = map(func, range(d.table_size ** 2))
  38. for i, index in enumerate(indices):
  39. x, y = index
  40. output[y][x] = i
  41. with open(func.__name__ + ".csv", "w", newline="") as file:
  42. writer = csv.writer(file)
  43. writer.writerows(output)