b.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import os, argparse
  2. import numpy as np
  3. debug_print = print
  4. debug_print = lambda x: x
  5. def solve_task(lines):
  6. s = Snake(9)
  7. s.print()
  8. for line in lines:
  9. s.do(line)
  10. #s.print()
  11. print(f"Tail visited {s.tail_visited()} spaces")
  12. class Snake:
  13. def __init__(self, length = 1):
  14. self.length = length
  15. self.pos = np.array([0, 0])
  16. if length > 0:
  17. self.body = Snake(length-1)
  18. self.visited = set()
  19. self.visited.add(tuple(self.pos))
  20. def tail_visited(self):
  21. if self.length == 0:
  22. return len(self.visited)
  23. else:
  24. return self.body.tail_visited()
  25. def print(self):
  26. print(f"{self.length}: {self.pos}")
  27. #print(self.visited)
  28. if self.length > 0:
  29. self.body.print()
  30. def do(self, instruction):
  31. command = instruction.split(' ')[0]
  32. distance = int(instruction.split(' ')[1])
  33. for _ in range(distance):
  34. self.move(command)
  35. self.body.follow(self.pos)
  36. def move(self, direction):
  37. debug_print(f"Moving {direction}")
  38. if direction == 'R':
  39. self.pos[0] += 1
  40. elif direction == 'L':
  41. self.pos[0] -= 1
  42. elif direction == 'U':
  43. self.pos[1] += 1
  44. elif direction == 'D':
  45. self.pos[1] -= 1
  46. def follow(self, new_pos):
  47. debug_print(f"Euclidian distance from T:{self.pos} to H:{new_pos} to is {np.linalg.norm(self.pos - new_pos)}")
  48. if np.linalg.norm(self.pos - new_pos) >= 2:
  49. diff = new_pos - self.pos
  50. if diff[0] > 0:
  51. self.pos[0] += 1
  52. elif diff[0] < 0:
  53. self.pos[0] -= 1
  54. if diff[1] > 0:
  55. self.pos[1] += 1
  56. elif diff[1] < 0:
  57. self.pos[1] -= 1
  58. debug_print(f"Tail moving from {self.pos}")
  59. self.visited.add(tuple(self.pos))
  60. if self.length > 0:
  61. self.body.follow(self.pos)
  62. else:
  63. debug_print(f"Tail not moving from {self.pos}")
  64. def read_lines(filename):
  65. lines = []
  66. with open(filename) as infile:
  67. for raw_line in infile:
  68. line = raw_line.rstrip()
  69. lines.append(line)
  70. return lines
  71. def parse_arguments():
  72. parser = argparse.ArgumentParser(description="Script that solves the case",epilog="Have a nice day!")
  73. parser.add_argument('filename', nargs='?', default="example.txt", help='Input file')
  74. args = parser.parse_args()
  75. return args
  76. def main():
  77. args = parse_arguments()
  78. lines = read_lines(args.filename)
  79. solve_task(lines)
  80. if __name__ == "__main__":
  81. main()