



'''simple docstring'''



from timeit import timeit

lowerCAmelCase_     :       Optional[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   (						A  :				str				):
							SCREAMING_SNAKE_CASE					:      int     					=			0
							SCREAMING_SNAKE_CASE					:      Optional[Any]     					=			len(A				) - 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   (						A  :				str				):
							SCREAMING_SNAKE_CASE					:      Optional[Any]     					=			len(A				) // 2
							SCREAMING_SNAKE_CASE					:      Any     					=			len(A				)

							# 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(A				)				)
def 					UpperCAmelCase   (						A  :				str				):
							if len(A				) <= 2:
														return True
							if s[0] == s[len(A				) - 1]:
														return is_palindrome_recursive(s[1:-1]				)
							else:
														return False
def 					UpperCAmelCase   (						A  :				str				):
							return s == s[::-1]
def 					UpperCAmelCase   (						A  :				str				):
							SCREAMING_SNAKE_CASE					:      Tuple     					=			F"""all({name}(key) is value for key, value in test_data.items())"""
							SCREAMING_SNAKE_CASE					:      Union[str, Any]     					=			F"""from __main__ import test_data, {name}"""
							SCREAMING_SNAKE_CASE					:      Dict     					=			500000
							SCREAMING_SNAKE_CASE					:      str     					=			timeit(stmt=A					,		setup=A					,		number=A				)
							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')









'''simple docstring'''



import os


# All paths are set with the intent you should run this script from the root of the repo with the command
# python utils/check_doctest_list.py
lowerCAmelCase_     :       Optional[Any]								=						'.'


if __name__ == "__main__":
							lowerCAmelCase_     :       Optional[Any]								=						os.path.join(REPO_PATH, 'utils/documentation_tests.txt')
							lowerCAmelCase_     :       Dict								=						[]
							lowerCAmelCase_     :       Any								=						[]
							with open(doctest_file_path) as fp:
														for line in fp:
																					lowerCAmelCase_     :       List[str]								=						line.strip()
																					lowerCAmelCase_     :       Optional[Any]								=						os.path.join(REPO_PATH, line)
																					if not (os.path.isfile(path) or os.path.isdir(path)):
																												non_existent_paths.append(line)
																					all_paths.append(path)
							if len(non_existent_paths) > 0:
														lowerCAmelCase_     :       Dict								=						'\n'.join(non_existent_paths)
														raise ValueError(f'`utils/documentation_tests.txt` contains non-existent paths:\n{non_existent_paths}')
							if all_paths != sorted(all_paths):
														raise ValueError('Files in `utils/documentation_tests.txt` are not in alphabetical order.')




