class TestPointMethods(unittest.TestCase): def setUp(self): self.p1 = Point(1, 1) self.p2 = Point(1, -5) self.p3 = Point(0, 2) self.p4 = Point(-3, 5) def test_copy(self): test_point = self.p1.copy() self.assertEqual(test_point, self.p1) test_point.x = 0 self.assertNotEqual(test_point, self.p1) def test_manhattan_distance(self): self.assertEqual(self.p1.manhattan_distance(self.p2), 6) self.assertEqual(self.p2.manhattan_distance(self.p3), 8) self.assertEqual(self.p3.manhattan_distance(self.p4), 6) self.assertEqual(self.p4.manhattan_distance(self.p1), 8) def test_euclidean_distance(self): self.assertEqual(self.p1.euclidean_distance(self.p2), 6) self.assertEqual(self.p2.euclidean_distance(self.p3), 50**0.5) self.assertEqual(self.p3.euclidean_distance(self.p4), 18**0.5) self.assertEqual(self.p4.euclidean_distance(self.p1), 32**0.5) def test_midpoint(self): self.assertEqual(self.p1.midpoint(self.p2), Point(1, -2)) self.assertEqual(self.p2.midpoint(self.p3), Point(0.5, -1.5)) self.assertEqual(self.p3.midpoint(self.p4), Point(-1.5, 3.5)) self.assertEqual(self.p4.midpoint(self.p1), Point(-1, 3)) def test_bounded_filter(self): pass def test_in_bounds(self): self.assertTrue( self.p1.in_bounds(lower_bound=Point(0, 0), upper_bound=Point(5, 5))) self.assertTrue( self.p2.in_bounds(lower_bound=Point(-1, -5), upper_bound=Point(10, 10))) self.assertFalse( self.p3.in_bounds(lower_bound=Point(-10, -10), upper_bound=Point(0, 0))) self.assertFalse( self.p4.in_bounds(lower_bound=Point(-5, -10), upper_bound=self.p4)) def test_as_tuple(self): self.assertSequenceEqual(self.p1.as_tuple(), (1, 1)) self.assertSequenceEqual(self.p2.as_tuple(), (1, -5)) self.assertSequenceEqual(self.p3.as_tuple(), (0, 2)) self.assertSequenceEqual(self.p4.as_tuple(), (-3, 5))
value -= 90 elif action == 'L': while value != 0: dir = Point(-dir.y,dir.x) value -= 90 elif action == 'F': pos += dir*value elif action == 'N': pos += Point(0,1) * value elif action == 'S': pos += Point(0,-1) * value elif action == 'E': pos += Point(1,0) * value elif action == 'W': pos += Point(-1,0) * value print('Result 1:',pos.manhattan_distance(Point(0,0))) ship = Point(0,0) waypoint = Point(10,1) for step in steps: action = step[0] value = int(step[1:]) diff = waypoint - ship if action == 'R': while value != 0: diff = Point(diff.y,-diff.x) value -= 90 waypoint = ship + diff elif action == 'L': while value != 0:
def turn_left(pt): return Point(-pt.y, pt.x) def turn_right(pt): return Point(pt.y, -pt.x) with open('2016/01/input.txt') as in_file: directions = in_file.readline().strip().split(', ') cur = Point(0, 0) seen = {cur} facing = Point(0, 1) for dir in directions: if dir[0] == 'L': facing = turn_left(facing) elif dir[0] == 'R': facing = turn_right(facing) found = False for i in range(int(dir[1:])): cur = cur + facing if cur in seen: found = True break seen.add(cur) if found: break print('The Easter Bunny Headquarters are {} blocks away.'.format( cur.manhattan_distance(Point(0, 0))))