diff --git a/extra/bringing-a-gun-to-a-trainer-fight/solution.py b/extra/bringing-a-gun-to-a-trainer-fight/solution.py index 23f76b8..4995414 100644 --- a/extra/bringing-a-gun-to-a-trainer-fight/solution.py +++ b/extra/bringing-a-gun-to-a-trainer-fight/solution.py @@ -2,21 +2,14 @@ import math def solution(dimentions, your_position, trainer_position, distance): direction_target_map = {} - count = 0 - for reflected_position, direction, length, is_trainer in generate_reflected_positions(dimentions, your_position, trainer_position, distance): + for position, direction, is_trainer in generate_reflected_positions(dimentions, your_position, trainer_position, distance): if direction in direction_target_map: - prev_length, prev_is_trainer = direction_target_map[direction] - if length < prev_length: - if is_trainer and ~prev_is_trainer: - count += 1 - elif ~is_trainer and prev_is_trainer: - count -= 1 - direction_target_map[direction] = (length, is_trainer) + prev_is_trainer, prev_position = direction_target_map[direction] + if abs(position[0] - your_position[0]) < abs(prev_position[0] - your_position[0]): + direction_target_map[direction] = (is_trainer, position) else: - if is_trainer: - count += 1 - direction_target_map[direction] = (length, is_trainer) - return count + direction_target_map[direction] = (is_trainer, position) + return len([0 for d, (is_trainer, position) in direction_target_map.items() if is_trainer and line_length(your_position, position) <= distance]) def generate_room_id(dimentions, your_position, distance): 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 your_direction = calc_direction(your_position, reflected_your_position) if your_direction not in memo: - reflected_your_distance = line_length(your_position, reflected_your_position) - if reflected_your_distance <= distance: - yield reflected_your_position, your_direction, reflected_your_distance, False + yield reflected_your_position, your_direction, False reflected_trainer_position = x_base + trainer_x_offset, y_base + trainer_y_offset trainer_direction = calc_direction(your_position, reflected_trainer_position) if trainer_direction not in memo: - reflected_trainer_distance = line_length(your_position, reflected_trainer_position) - if reflected_trainer_distance <= distance: - yield reflected_trainer_position, trainer_direction, reflected_trainer_distance, True + yield reflected_trainer_position, trainer_direction, True memo[your_direction] = 0 memo[trainer_direction] = 0