def solution(banana_list): fewest_possible_number = len(banana_list) for pairs in generate_trainer_pairs(list(range(len(banana_list)))): possible_number = len(banana_list) for i, j in pairs: if check_loop(banana_list[i], banana_list[j]): possible_number -= 2 if possible_number < fewest_possible_number: fewest_possible_number = possible_number return fewest_possible_number import copy def generate_trainer_pairs(trainer_id_list): if len(trainer_id_list) < 2: yield [] else: first_id = trainer_id_list[0] temp_list = copy.deepcopy(trainer_id_list) temp_list.remove(first_id) for second_id in temp_list: tt_list = copy.deepcopy(temp_list) tt_list.remove(second_id) for pairs in generate_trainer_pairs(tt_list): yield [(first_id, second_id)] + pairs def check_loop(x, y): a, b = x, y memo = [] while a != b: if a > b: a, b = a - b, 2*b else: a, b = 2*a, b - a if (a, b) in memo: return True else: memo += [(a, b)] return False tests = [ ([1, 1], 2), ([1, 7, 3, 21, 13, 19], 0), ] for i, o in tests: result = solution(i) print(i, result == o, result, o)