finish extra/distract-the-trainers #11
@ -1,12 +1,15 @@
|
|||||||
def solution(banana_list):
|
def solution(banana_list):
|
||||||
fewest_possible_number = len(banana_list)
|
fewest_possible_number = len(banana_list)
|
||||||
|
memo = {}
|
||||||
for pairs in generate_trainer_pairs(list(range(len(banana_list)))):
|
for pairs in generate_trainer_pairs(list(range(len(banana_list)))):
|
||||||
possible_number = len(banana_list)
|
possible_number = len(banana_list)
|
||||||
for i, j in pairs:
|
for i, j in pairs:
|
||||||
if check_loop(banana_list[i], banana_list[j]):
|
if check_loop(banana_list[i], banana_list[j], memo):
|
||||||
possible_number -= 2
|
possible_number -= 2
|
||||||
if possible_number < fewest_possible_number:
|
if possible_number < fewest_possible_number:
|
||||||
fewest_possible_number = possible_number
|
fewest_possible_number = possible_number
|
||||||
|
if fewest_possible_number < 2: # early termination
|
||||||
|
break
|
||||||
return fewest_possible_number
|
return fewest_possible_number
|
||||||
|
|
||||||
import copy
|
import copy
|
||||||
@ -15,28 +18,25 @@ def generate_trainer_pairs(trainer_id_list):
|
|||||||
yield []
|
yield []
|
||||||
else:
|
else:
|
||||||
first_id = trainer_id_list[0]
|
first_id = trainer_id_list[0]
|
||||||
temp_list = copy.deepcopy(trainer_id_list)
|
for second_id in trainer_id_list[1:]:
|
||||||
temp_list.remove(first_id)
|
reduced_list = copy.deepcopy(trainer_id_list)
|
||||||
for second_id in temp_list:
|
seduced_list.remove(first_id)
|
||||||
tt_list = copy.deepcopy(temp_list)
|
reduced_list.remove(second_id)
|
||||||
tt_list.remove(second_id)
|
for pairs in generate_trainer_pairs(reduced_list):
|
||||||
for pairs in generate_trainer_pairs(tt_list):
|
|
||||||
yield [(first_id, second_id)] + pairs
|
yield [(first_id, second_id)] + pairs
|
||||||
|
|
||||||
def check_loop(x, y):
|
def check_loop(a, b, memo):
|
||||||
if (x + y) % 2 == 1: # sum is odd
|
|
||||||
return True
|
|
||||||
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:
|
if (a, b) in memo:
|
||||||
|
return memo[(a, b)]
|
||||||
|
while a != b:
|
||||||
|
if (a + b) % 2 == 1: # sum is odd
|
||||||
|
memo[(a, b)] = True
|
||||||
return True
|
return True
|
||||||
|
if a > b:
|
||||||
|
a, b = (a - b)/2, b
|
||||||
else:
|
else:
|
||||||
memo += [(a, b)]
|
a, b = a, (b - a)/2
|
||||||
|
memo[(a, b)] = False
|
||||||
return False
|
return False
|
||||||
|
|
||||||
tests = [
|
tests = [
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user