


'''simple docstring'''






from timeit import timeit

a_   :      Union[str, 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 		_A			(lowerCAmelCase__					:str						)				->					Union[str, Any]:




     '''simple docstring'''



     _a      =							0
     _a      =							len(lowerCamelCase__						) - 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 		_A			(lowerCAmelCase__					:str						)				->					Union[str, Any]:




     '''simple docstring'''



     _a      =							len(lowerCamelCase__						) // 2
     _a      =							len(lowerCamelCase__						)

     # 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(lowerCamelCase__						)						)






def 		_A			(lowerCAmelCase__					:str						)				->					str:




     '''simple docstring'''



     if len(lowerCamelCase__						) <= 2:
          return True
     if s[0] == s[len(lowerCamelCase__						) - 1]:
          return is_palindrome_recursive(s[1:-1]						)
     else:
          return False






def 		_A			(lowerCAmelCase__					:str						)				->					Optional[int]:




     '''simple docstring'''



     return s == s[::-1]






def 		_A			(lowerCAmelCase__					:str						)				->					Optional[int]:




     '''simple docstring'''



     _a      =							f'all({name}(key) is value for key, value in test_data.items())'
     _a      =							f'from __main__ import test_data, {name}'
     _a      =							50_00_00
     _a      =							timeit(stmt=lowerCamelCase__			,  setup=lowerCamelCase__			,  number=lowerCamelCase__						)
     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'''






from timeit import timeit






def 		_A			(lowerCAmelCase__					:int						)				->					int:




     '''simple docstring'''



     if number < 0:
          raise ValueError('the value of input must not be negative'						)
     _a      =							0
     while number:
          number &= number - 1
          result += 1
     return result






def 		_A			(lowerCAmelCase__					:int						)				->					int:




     '''simple docstring'''



     if number < 0:
          raise ValueError('the value of input must not be negative'						)
     _a      =							0
     while number:
          if number % 2 == 1:
               result += 1
          number >>= 1
     return result






def 		_A			()				->					None:




     '''simple docstring'''



     def do_benchmark(lowerCAmelCase__					:int						) -> None:
          _a      =							'import __main__ as z'
          print(f'Benchmark when {number = }:'						)
          print(f'{get_set_bits_count_using_modulo_operator(lowerCAmelCase__						) = }'						)
          _a      =							timeit('z.get_set_bits_count_using_modulo_operator(25)'			,  setup=lowerCAmelCase__						)
          print(f'timeit() runs in {timing} seconds'						)
          print(f'{get_set_bits_count_using_brian_kernighans_algorithm(lowerCAmelCase__						) = }'						)
          _a      =							timeit(
              'z.get_set_bits_count_using_brian_kernighans_algorithm(25)'			,  setup=lowerCAmelCase__			,  )
          print(f'timeit() runs in {timing} seconds'						)

     for number in (25, 37, 58, 0):
          do_benchmark(lowerCAmelCase__						)
          print()


if __name__ == "__main__":
 import doctest

 doctest.testmod()
 benchmark()

