03_spiral.py 883 B

12345678910111213141516171819202122232425262728293031323334353637
  1. #!/usr/bin/env python3
  2. def spiral_coords():
  3. x = y = 0
  4. step = 1
  5. while True:
  6. for x in range(x + 1, x + step + 1):
  7. yield x, y
  8. for y in range(y - 1, y - step - 1, - 1):
  9. yield x, y
  10. step += 1
  11. for x in range(x - 1, x - step - 1, -1):
  12. yield x, y
  13. for y in range(y + 1, y + step + 1):
  14. yield x, y
  15. step += 1
  16. def spiral_dist(n):
  17. for i, (x, y) in zip(range(n - 1), spiral_coords()):
  18. pass
  19. return abs(x) + abs(y)
  20. # part 1
  21. inp = 277678
  22. print(spiral_dist(inp))
  23. # part 2
  24. w = 100
  25. grid = w * w * [0]
  26. mid = w // 2
  27. grid[mid * w + mid] = 1
  28. neighbour_offsets = (-w - 1, -w, -w + 1, -1, 1, w - 1, w, w + 1)
  29. for x, y in spiral_coords():
  30. i = (y + mid) * w + (x + mid)
  31. n = grid[i] = sum(grid[i + nb] for nb in neighbour_offsets)
  32. if n >= inp:
  33. print(n)
  34. break