



'''simple docstring'''


from __future__ import annotations

from scipy.special import comb  # type: ignore







class 	UpperCAmelCase	:


	'''simple docstring'''




	def __init__(   self							,  lowerCAmelCase_) ->      List[Any]:



						"""simple docstring"""







						a_       		=list_of_points
						# Degree determines the flexibility of the curve.
						# Degree = 1 will produce a straight line.
						a_       		=len(lowerCAmelCase_) - 1




	def       lowercase_  (   self							,  lowerCAmelCase_) ->      list[float]:



						"""simple docstring"""







						assert 0 <= t <= 1, "Time t must be between 0 and 1."
						a_       		=[]
						for i in range(len(self.list_of_points)):
											# basis function for each i
											output_values.append(
											    comb(self.degree							,  lowerCAmelCase_) * ((1 - t) ** (self.degree - i)) * (t**i))
						# the basis must sum up to 1 for it to produce a valid Bezier curve.
						assert round(sum(lowerCAmelCase_)							,  5) == 1
						return output_values




	def       lowercase_  (   self							,  lowerCAmelCase_) ->      tuple[float, float]:



						"""simple docstring"""







						assert 0 <= t <= 1, "Time t must be between 0 and 1."

						a_       		=self.basis_function(lowerCAmelCase_)
						a_       		=0.0
						a_       		=0.0
						for i in range(len(self.list_of_points)):
											# For all points, sum up the product of i-th basis function and i-th point.
											x += basis_function[i] * self.list_of_points[i][0]
											y += basis_function[i] * self.list_of_points[i][1]
						return (x, y)




	def       lowercase_  (   self							,  lowerCAmelCase_ = 0.0_1) ->      Optional[int]:



						"""simple docstring"""







						from matplotlib import pyplot as plt  # type: ignore

						a_       		=[]  # x coordinates of points to plot
						a_       		=[]  # y coordinates of points to plot

						a_       		=0.0
						while t <= 1:
											a_       		=self.bezier_curve_function(lowerCAmelCase_)
											to_plot_x.append(value[0])
											to_plot_y.append(value[1])
											t += step_size

						a_       		=[i[0] for i in self.list_of_points]
						a_       		=[i[1] for i in self.list_of_points]

						plt.plot(
						    lowerCAmelCase_							,  lowerCAmelCase_							,  color="blue"							,  label="Curve of Degree " + str(self.degree)							,  )
						plt.scatter(lowerCAmelCase_							,  lowerCAmelCase_							,  color="red"							,  label="Control Points")
						plt.legend()
						plt.show()


if __name__ == "__main__":
		import doctest

		doctest.testmod()

		BezierCurve([(1, 2), (3, 5)]).plot_curve()  # degree 1
		BezierCurve([(0, 0), (5, 5), (5, 0)]).plot_curve()  # degree 2
		BezierCurve([(0, 0), (5, 5), (5, 0), (2.5, -2.5)]).plot_curve()  # degree 3







'''simple docstring'''


from __future__ import annotations






def  UpperCAmelCase_       (		lowercase__       ):


     '''simple docstring'''







     a_       		=str(lowercase__       )
     return len(lowercase__       ) == 9 and set(lowercase__       ) == set("123456789"       )






def  UpperCAmelCase_       (		):


     '''simple docstring'''







     for base_num in range(9_9_9_9       ,	4_9_9_9       ,	-1       ):
          a_       		=1_0_0_0_0_2 * base_num
          if is_9_pandigital(lowercase__       ):
               return candidate

     for base_num in range(3_3_3       ,	9_9       ,	-1       ):
          a_       		=1_0_0_2_0_0_3 * base_num
          if is_9_pandigital(lowercase__       ):
               return candidate

     return None


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


