
from timeit import timeit

A		: List[Any]								=     {
    '''MALAYALAM''': True,
    '''String''': False,
    '''rotor''': True,
    '''level''': True,
    '''A''': True,
    '''BB''': True,
    '''ABC''': False,
    '''amanaplanacanalpanama''': True,  # "a man a plan a canal panama"
}
# Ensure our test data is valid
assert all((key == key[::-1]) is value for key, value in test_data.items())




def 	UpperCamelCase__  (     SCREAMING_SNAKE_CASE_	:	str       )  ->     bool:
						_lowercase					       =					0
						_lowercase					       =					len(SCREAMING_SNAKE_CASE_       ) - 1
						while start_i < end_i:
												if s[start_i] == s[end_i]:
																		start_i += 1
																		end_i -= 1
												else:
																		return False
						return True




def 	UpperCamelCase__  (     SCREAMING_SNAKE_CASE_	:	str       )  ->     bool:
						_lowercase					       =					len(SCREAMING_SNAKE_CASE_       ) // 2
						_lowercase					       =					len(SCREAMING_SNAKE_CASE_       )

						# We need to traverse till half of the length of string
						# as we can get access of the i'th last element from
						# i'th index.
						# eg: [0,1,2,3,4,5] => 4th index can be accessed
						# with the help of 1st index (i==n-i-1)
						# where n is length of string
						return all(s[i] == s[n - i - 1] for i in range(SCREAMING_SNAKE_CASE_       )       )




def 	UpperCamelCase__  (     SCREAMING_SNAKE_CASE_	:	str       )  ->     bool:
						if len(SCREAMING_SNAKE_CASE_       ) <= 2:
												return True
						if s[0] == s[len(SCREAMING_SNAKE_CASE_       ) - 1]:
												return is_palindrome_recursive(s[1:-1]       )
						else:
												return False




def 	UpperCamelCase__  (     SCREAMING_SNAKE_CASE_	:	str       )  ->     bool:
						return s == s[::-1]




def 	UpperCamelCase__  (     SCREAMING_SNAKE_CASE_	:	str       )  ->     None:
						_lowercase					       =					f"""all({name}(key) is value for key, value in test_data.items())"""
						_lowercase					       =					f"""from __main__ import test_data, {name}"""
						_lowercase					       =					50_00_00
						_lowercase					       =					timeit(stmt=SCREAMING_SNAKE_CASE_		,   setup=SCREAMING_SNAKE_CASE_		,   number=SCREAMING_SNAKE_CASE_       )
						print(f"""{name:<35} finished {number:,} runs in {result:.5f} seconds"""       )


if __name__ == "__main__":
		for key, value in test_data.items():
				assert is_palindrome(key) is is_palindrome_recursive(key)
				assert is_palindrome(key) is is_palindrome_slice(key)
				print(F'{key:21} {value}')
		print('''a man a plan a canal panama''')

		# finished 500,000 runs in 0.46793 seconds
		benchmark_function('''is_palindrome_slice''')
		# finished 500,000 runs in 0.85234 seconds
		benchmark_function('''is_palindrome''')
		# finished 500,000 runs in 1.32028 seconds
		benchmark_function('''is_palindrome_recursive''')
		# finished 500,000 runs in 2.08679 seconds
		benchmark_function('''is_palindrome_traversal''')

def 	UpperCamelCase__  (     SCREAMING_SNAKE_CASE_	:	int = 2_00_00_00       )  ->     int:
						_lowercase					       =					[0 for i in range(n + 1       )]
						_lowercase					       =					1
						_lowercase					       =					1

						for i in range(2		,   int(n**0.5       ) + 1       ):
												if primality_list[i] == 0:
																		for j in range(i * i		,   n + 1		,   SCREAMING_SNAKE_CASE_       ):
																								_lowercase					       =					1
						_lowercase					       =					0
						for i in range(SCREAMING_SNAKE_CASE_       ):
												if primality_list[i] == 0:
																		sum_of_primes += i
						return sum_of_primes


if __name__ == "__main__":
		print(F'{solution() = }')