finish extra/bringing-a-gun-to-a-trainer-fight #9
@ -2,21 +2,14 @@ import math
|
|||||||
|
|
||||||
def solution(dimentions, your_position, trainer_position, distance):
|
def solution(dimentions, your_position, trainer_position, distance):
|
||||||
direction_target_map = {}
|
direction_target_map = {}
|
||||||
count = 0
|
for position, direction, is_trainer in generate_reflected_positions(dimentions, your_position, trainer_position, distance):
|
||||||
for reflected_position, direction, length, is_trainer in generate_reflected_positions(dimentions, your_position, trainer_position, distance):
|
|
||||||
if direction in direction_target_map:
|
if direction in direction_target_map:
|
||||||
prev_length, prev_is_trainer = direction_target_map[direction]
|
prev_is_trainer, prev_position = direction_target_map[direction]
|
||||||
if length < prev_length:
|
if abs(position[0] - your_position[0]) < abs(prev_position[0] - your_position[0]):
|
||||||
if is_trainer and ~prev_is_trainer:
|
direction_target_map[direction] = (is_trainer, position)
|
||||||
count += 1
|
|
||||||
elif ~is_trainer and prev_is_trainer:
|
|
||||||
count -= 1
|
|
||||||
direction_target_map[direction] = (length, is_trainer)
|
|
||||||
else:
|
else:
|
||||||
if is_trainer:
|
direction_target_map[direction] = (is_trainer, position)
|
||||||
count += 1
|
return len([0 for d, (is_trainer, position) in direction_target_map.items() if is_trainer and line_length(your_position, position) <= distance])
|
||||||
direction_target_map[direction] = (length, is_trainer)
|
|
||||||
return count
|
|
||||||
|
|
||||||
def generate_room_id(dimentions, your_position, distance):
|
def generate_room_id(dimentions, your_position, distance):
|
||||||
memo = []
|
memo = []
|
||||||
@ -53,15 +46,11 @@ def generate_reflected_positions(dimentions, your_position, trainer_position, di
|
|||||||
reflected_your_position = x_base + your_x_offset, y_base + your_y_offset
|
reflected_your_position = x_base + your_x_offset, y_base + your_y_offset
|
||||||
your_direction = calc_direction(your_position, reflected_your_position)
|
your_direction = calc_direction(your_position, reflected_your_position)
|
||||||
if your_direction not in memo:
|
if your_direction not in memo:
|
||||||
reflected_your_distance = line_length(your_position, reflected_your_position)
|
yield reflected_your_position, your_direction, False
|
||||||
if reflected_your_distance <= distance:
|
|
||||||
yield reflected_your_position, your_direction, reflected_your_distance, False
|
|
||||||
reflected_trainer_position = x_base + trainer_x_offset, y_base + trainer_y_offset
|
reflected_trainer_position = x_base + trainer_x_offset, y_base + trainer_y_offset
|
||||||
trainer_direction = calc_direction(your_position, reflected_trainer_position)
|
trainer_direction = calc_direction(your_position, reflected_trainer_position)
|
||||||
if trainer_direction not in memo:
|
if trainer_direction not in memo:
|
||||||
reflected_trainer_distance = line_length(your_position, reflected_trainer_position)
|
yield reflected_trainer_position, trainer_direction, True
|
||||||
if reflected_trainer_distance <= distance:
|
|
||||||
yield reflected_trainer_position, trainer_direction, reflected_trainer_distance, True
|
|
||||||
memo[your_direction] = 0
|
memo[your_direction] = 0
|
||||||
memo[trainer_direction] = 0
|
memo[trainer_direction] = 0
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user