


import math
from datetime import datetime, timedelta


def     lowerCamelCase_	(      lowerCAmelCase:	int				)->		datetime:
  _snake_case   :				Optional[Any]														=	year % 19
  _snake_case   :				List[Any]														=	year % 4
  _snake_case   :				Optional[Any]														=	year % 7
  _snake_case   :				List[str]														=	math.floor(year / 1_00				)
  _snake_case   :				Optional[int]														=	math.floor((13 + 8 * leap_day_inhibits) / 25				)
  _snake_case   :				Union[str, Any]														=	leap_day_inhibits / 4
  _snake_case   :				List[str]														=	(
      15 - lunar_orbit_correction + leap_day_inhibits - leap_day_reinstall_number
  ) % 30
  _snake_case   :				Any														=	(4 + leap_day_inhibits - leap_day_reinstall_number) % 7

  # days to be added to March 21
  _snake_case   :				List[str]														=	(19 * metonic_cycle + secular_moon_shift) % 30

  # PHM -> Paschal Full Moon
  _snake_case   :				Any														=	(
      2 * julian_leap_year
      + 4 * non_leap_year
      + 6 * days_to_add
      + century_starting_point
  ) % 7

  if days_to_add == 29 and days_from_phm_to_sunday == 6:
    return datetime(lowerCAmelCase    ,							4    ,							19				)
  elif days_to_add == 28 and days_from_phm_to_sunday == 6:
    return datetime(lowerCAmelCase    ,							4    ,							18				)
  else:
    return datetime(lowerCAmelCase    ,							3    ,							22				) + timedelta(
        days=int(days_to_add + days_from_phm_to_sunday				)				)


if __name__ == "__main__":
      for year in (1994, 2000, 2010, 2021, 2023):
            lowerCAmelCase_						   =    """will be""" if year > datetime.now().year else """was"""
            print(F"""Easter in {year} {tense} {gauss_easter(year)}""")











import math
import random
from typing import Any

from .hill_climbing import SearchProblem


def     lowerCamelCase_	(      lowerCAmelCase:	Tuple    ,							lowerCAmelCase:	bool = True    ,							lowerCAmelCase:	float = math.inf    ,							lowerCAmelCase:	float = -math.inf    ,							lowerCAmelCase:	float = math.inf    ,							lowerCAmelCase:	float = -math.inf    ,							lowerCAmelCase:	bool = False    ,							lowerCAmelCase:	float = 1_00    ,							lowerCAmelCase:	float = 0.0_1    ,							lowerCAmelCase:	float = 1    ,							)->		Any:
  _snake_case   :				int														=	False
  _snake_case   :				Any														=	search_prob
  _snake_case   :				Tuple														=	start_temperate
  _snake_case   :				Any														=	[]
  _snake_case   :				List[str]														=	0
  _snake_case   :				Optional[Any]														=	None

  while not search_end:
    _snake_case   :				List[Any]														=	current_state.score()
    if best_state is None or current_score > best_state.score():
      _snake_case   :				Dict														=	current_state
    scores.append(lowerCAmelCase				)
    iterations += 1
    _snake_case   :				Optional[int]														=	None
    _snake_case   :				Union[str, Any]														=	current_state.get_neighbors()
    while (
        next_state is None and neighbors
    ):  # till we do not find a neighbor that we can move to
      _snake_case   :				Dict														=	random.randint(0    ,							len(lowerCAmelCase				) - 1				)  # picking a random neighbor
      _snake_case   :				int														=	neighbors.pop(lowerCAmelCase				)
      _snake_case   :				Union[str, Any]														=	picked_neighbor.score() - current_score

      if (
          picked_neighbor.x > max_x
          or picked_neighbor.x < min_x
          or picked_neighbor.y > max_y
          or picked_neighbor.y < min_y
      ):
        continue  # neighbor outside our bounds

      if not find_max:
        _snake_case   :				Union[str, Any]														=	change * -1  # in case we are finding minimum
      if change > 0:  # improves the solution
        _snake_case   :				Union[str, Any]														=	picked_neighbor
      else:
        _snake_case   :				Optional[Any]														=	(math.e) ** (
            change / current_temp
        )  # probability generation function
        if random.random() < probability:  # random number within probability
          _snake_case   :				int														=	picked_neighbor
    _snake_case   :				List[Any]														=	current_temp - (current_temp * rate_of_decrease)

    if current_temp < threshold_temp or next_state is None:
      # temperature below threshold, or could not find a suitable neighbor
      _snake_case   :				List[str]														=	True
    else:
      _snake_case   :				Union[str, Any]														=	next_state

  if visualization:
    from matplotlib import pyplot as plt

    plt.plot(range(lowerCAmelCase				)    ,							lowerCAmelCase				)
    plt.xlabel('Iterations'				)
    plt.ylabel('Function values'				)
    plt.show()
  return best_state


if __name__ == "__main__":


      def     lowerCamelCase_	(      lowerCAmelCase:	Any    ,							lowerCAmelCase:	List[Any]				)->		List[Any]:
        return (x**2) + (y**2)

      # starting the problem with initial coordinates (12, 47)
      lowerCAmelCase_						   =    SearchProblem(x=12, y=47, step_size=1, function_to_optimize=test_fa)
      lowerCAmelCase_						   =    simulated_annealing(
          prob, find_max=False, max_x=100, min_x=5, max_y=50, 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()}"""
      )

      # starting the problem with initial coordinates (12, 47)
      lowerCAmelCase_						   =    SearchProblem(x=12, y=47, step_size=1, function_to_optimize=test_fa)
      lowerCAmelCase_						   =    simulated_annealing(
          prob, find_max=True, max_x=100, min_x=5, max_y=50, min_y=-5, visualization=True
      )
      print(
          """The maximum 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     lowerCamelCase_	(      lowerCAmelCase:	Any    ,							lowerCAmelCase:	Dict				)->		Dict:
        return (3 * x**2) - (6 * y)

      lowerCAmelCase_						   =    SearchProblem(x=3, y=4, step_size=1, function_to_optimize=test_fa)
      lowerCAmelCase_						   =    simulated_annealing(prob, find_max=False, visualization=True)
      print(
          """The minimum score for f(x, y) = 3*x^2 - 6*y found via hill climbing: """
          F"""{local_min.score()}"""
      )

      lowerCAmelCase_						   =    SearchProblem(x=3, y=4, step_size=1, function_to_optimize=test_fa)
      lowerCAmelCase_						   =    simulated_annealing(prob, find_max=True, visualization=True)







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




