
'''simple docstring'''





import math



class 			lowerCAmelCase__ :



  '''simple docstring'''






  def __init__(self	:			Optional[Any]						,			lowerCAmelCase_	:			int						,			lowerCAmelCase_	:			int						,			lowerCAmelCase_	:			int						,			lowerCAmelCase_	:			Optional[Any]     ) ->							Any:
        snake_case_    							=				x
        snake_case_    							=				y
        snake_case_    							=				step_size
        snake_case_    							=				function_to_optimize

  def 		_lowerCamelCase						(self	:			Optional[int]     ) ->							int:
        return self.function(self.x						,			self.y     )

  def 		_lowerCamelCase						(self	:			int     ) ->							Tuple:
        snake_case_    							=				self.step_size
        return [
            SearchProblem(lowerCAmelCase_						,			lowerCAmelCase_						,			lowerCAmelCase_						,			self.function     )
            for x, y in (
                (self.x - step_size, self.y - step_size),
                (self.x - step_size, self.y),
                (self.x - step_size, self.y + step_size),
                (self.x, self.y - step_size),
                (self.x, self.y + step_size),
                (self.x + step_size, self.y - step_size),
                (self.x + step_size, self.y),
                (self.x + step_size, self.y + step_size),
            )
        ]

  def __hash__(self	:			Optional[int]     ) ->							Union[str, Any]:
        return hash(str(self     )     )

  def __eq__(self	:			List[str]						,			lowerCAmelCase_	:			str     ) ->							Dict:
        if isinstance(lowerCAmelCase_						,			lowerCAmelCase_     ):
              return hash(str(self     )     ) == hash(str(lowerCAmelCase_     )     )
        return False


  def __str__(self	:			Tuple     ) ->							str:
        return f'''x: {self.x} y: {self.y}'''

def 	snake_case_							(				_a  :				Tuple			,       _a  :				bool = True			,       _a  :				float = math.inf			,       _a  :				float = -math.inf			,       _a  :				float = math.inf			,       _a  :				float = -math.inf			,       _a  :				bool = False			,       _a  :				int = 10_000			,       ):
      snake_case_    							=				search_prob
      snake_case_    							=				[]  # list to store the current score at each iteration
      snake_case_    							=				0
      snake_case_    							=				False
      snake_case_    							=				set()
      while not solution_found and iterations < max_iter:
            visited.add(_a      )
            iterations += 1
            snake_case_    							=				current_state.score()
            scores.append(_a      )
            snake_case_    							=				current_state.get_neighbors()
            snake_case_    							=				-math.inf
            snake_case_    							=				math.inf
            snake_case_    							=				None  # to hold the next best neighbor
            for neighbor in neighbors:
                  if neighbor in visited:
                        continue  # do not want to visit the same state again
                  if (
                      neighbor.x > max_x
                      or neighbor.x < min_x
                      or neighbor.y > max_y
                      or neighbor.y < min_y
                  ):
                        continue  # neighbor outside our bounds
                  snake_case_    							=				neighbor.score() - current_score
                  if find_max:  # finding max
                        # going to direction with greatest ascent
                        if change > max_change and change > 0:
                              snake_case_    							=				change
                              snake_case_    							=				neighbor
                  else:  # finding min
                        # to direction with greatest descent
                        if change < min_change and change < 0:
                              snake_case_    							=				change
                              snake_case_    							=				neighbor
            if next_state is not None:
                  # we found at least one neighbor which improved the current state
                  snake_case_    							=				next_state
            else:
                  # since we have no neighbor that improves the solution we stop the search
                  snake_case_    							=				True

      if visualization:
            from matplotlib import pyplot as plt

            plt.plot(range(_a      )			,       _a      )
            plt.xlabel("Iterations"      )
            plt.ylabel("Function values"      )
            plt.show()

      return current_state


if __name__ == "__main__":
     import doctest

     doctest.testmod()
     def 	snake_case_							(				_a  :				Optional[Any]			,       _a  :				Dict      ):
           return (x**2) + (y**2)

     # starting the problem with initial coordinates (3, 4)
     A							     = SearchProblem(x=3, y=4, step_size=1, function_to_optimize=test_fa)
     A							     = hill_climbing(prob, find_max=False)
     print(
         "The minimum score for f(x, y) = x^2 + y^2 found via hill climbing: "
         F"""{local_min.score()}"""
     )

     # starting the problem with initial coordinates (12, 47)
     A							     = SearchProblem(x=1_2, y=4_7, step_size=1, function_to_optimize=test_fa)
     A							     = hill_climbing(
         prob, find_max=False, max_x=1_0_0, min_x=5, max_y=5_0, min_y=-5, visualization=True
     )
     print(
         "The minimum score for f(x, y) = x^2 + y^2 with the domain 100 > x > 5 "
         F"""and 50 > y > - 5 found via hill climbing: {local_min.score()}"""
     )
     def 	snake_case_							(				_a  :				Optional[Any]			,       _a  :				Tuple      ):
           return (3 * x**2) - (6 * y)

     A							     = SearchProblem(x=3, y=4, step_size=1, function_to_optimize=test_fa)
     A							     = hill_climbing(prob, find_max=True)




     print(
         "The maximum score for f(x, y) = x^2 + y^2 found via hill climbing: "
         F"""{local_min.score()}"""
     )






import math





def 				A      (	_UpperCAmelCase							:  int       )							->					int:







			'''simple docstring'''
			return sum(int(_UpperCAmelCase       ) for digit in str(_UpperCAmelCase       )       )





def 				A      (	_UpperCAmelCase							:  int = 30       )							->					int:







			'''simple docstring'''
			_UpperCAmelCase									=  []
			for digit in range(2				,  100       ):
						for power in range(2				,  100       ):
									_UpperCAmelCase									=  int(math.pow(_UpperCAmelCase				,  _UpperCAmelCase       )       )
									if digit == digit_sum(_UpperCAmelCase       ):
												digit_to_powers.append(_UpperCAmelCase       )

			digit_to_powers.sort()
			return digit_to_powers[n - 1]


if __name__ == "__main__":
							print(solution())
