diff --git a/others/dodge-the-lasers/solution.py b/others/dodge-the-lasers/solution.py index f51436e..f3dc8df 100644 --- a/others/dodge-the-lasers/solution.py +++ b/others/dodge-the-lasers/solution.py @@ -1,49 +1,26 @@ import math from decimal import * -getcontext().prec = 102 -sqrt_2 = Decimal(2).sqrt() - def solution(s): - total = 0 - for i in range(int(s)+1): - total += int(math.floor(i*sqrt_2)) - #print i, total - return str(total) + getcontext().prec = 10000 + sqrt_2 = Decimal(2).sqrt() -def check_known_pattern(start, end, memo): - if '0'*(end-start+1) in memo: # TODO: checkk value in the memo - return '0'*(end-start+1) - return False + return str(beatty_sum(sqrt_2, int(s))) -def generate_dfs(start, end, memo): - pattern = check_known_pattern(start, end, memo) - if pattern: - yield pattern, memo[pattern] - else: - new_pattern = '' - new_value = 0 # TODO: calculate new_value - pivot = int(math.floor((start+end)/2)) # TODO: power of 2 is optimal - for pattern, value in generate_dfs(start, pivot, memo): - new_pattern += pattern - new_value += value - yield pattern, value - for pattern, value in generate_dfs(pivot + 1, end, memo): - new_pattern += pattern - new_value += value - yield pattern, value - memo[new_pattern] = new_value - -memo = {'0': 1, '1': 1} # TODO: upgrade memo -total = 0 -for pattern, value in generate_dfs(1, 5, memo): - total += value - print pattern, value -print total, memo - -exit(0) +def beatty_sum(r, n): + if n == 0: + return 0 + if n == 1: + return 1 + floor_r_n = int(math.floor(r*n)) + + return natural_number_sum(floor_r_n) - 2 * natural_number_sum(floor_r_n - n) - beatty_sum(r, floor_r_n - n) +def natural_number_sum(n): + return n*(n+1)/2 +def ten(n): + return 10**n tests = [ ['77', '4208'], @@ -57,6 +34,7 @@ tests = [ ['8', '47'], ['9', '59'], ['10', '73'], + [ten(100), '0'] ]