
import os
import sys
from contextlib import contextmanager


# Windows only
if os.name == "nt":
		import ctypes
		import msvcrt  # noqa







		class        lowerCAmelCase__      (   ctypes.Structure	):
								# _fields is a specific attr expected by ctypes
								UpperCamelCase_							: int	=		[("size", ctypes.c_int), ("visible", ctypes.c_byte)]


def 							__A()		->				Optional[Any]:

		"""simple docstring"""






		if os.name == "nt":
				_UpperCamelCase						    =	CursorInfo()
				_UpperCamelCase						    =	ctypes.windll.kernelaa.GetStdHandle(-1_1 )
				ctypes.windll.kernelaa.GetConsoleCursorInfo(lowerCAmelCase						,  ctypes.byref(lowerCAmelCase ) )
				_UpperCamelCase						    =	False
				ctypes.windll.kernelaa.SetConsoleCursorInfo(lowerCAmelCase						,  ctypes.byref(lowerCAmelCase ) )
		elif os.name == "posix":
				sys.stdout.write("""\033[?25l""" )
				sys.stdout.flush()


def 							__A()		->				List[Any]:

		"""simple docstring"""






		if os.name == "nt":
				_UpperCamelCase						    =	CursorInfo()
				_UpperCamelCase						    =	ctypes.windll.kernelaa.GetStdHandle(-1_1 )
				ctypes.windll.kernelaa.GetConsoleCursorInfo(lowerCAmelCase						,  ctypes.byref(lowerCAmelCase ) )
				_UpperCamelCase						    =	True
				ctypes.windll.kernelaa.SetConsoleCursorInfo(lowerCAmelCase						,  ctypes.byref(lowerCAmelCase ) )
		elif os.name == "posix":
				sys.stdout.write("""\033[?25h""" )
				sys.stdout.flush()







@contextmanager
def 							__A()		->				Tuple:

		"""simple docstring"""






		try:
				hide_cursor()
				yield
		finally:
				show_cursor()





from math import isclose, sqrt


def 							__A(lowerCAmelCase						,  lowerCAmelCase						,  lowerCAmelCase )		->				tuple[float, float, float]:

		"""simple docstring"""






		_UpperCamelCase						    =	point_y / 4 / point_x
		_UpperCamelCase						    =	2 * normal_gradient / (1 + normal_gradient * normal_gradient)
		_UpperCamelCase						    =	(1 - normal_gradient * normal_gradient) / (
		    1 + normal_gradient * normal_gradient
		)
		_UpperCamelCase						    =	(sa - ca * incoming_gradient) / (ca + sa * incoming_gradient)

		# to find the next point, solve the simultaeneous equations:
		# y^2 + 4x^2 = 100
		# y - b = m * (x - a)
		# ==> A x^2 + B x + C = 0
		_UpperCamelCase						    =	outgoing_gradient**2 + 4
		_UpperCamelCase						    =	2 * outgoing_gradient * (point_y - outgoing_gradient * point_x)
		_UpperCamelCase						    =	(point_y - outgoing_gradient * point_x) ** 2 - 1_0_0

		_UpperCamelCase						    =	(
		    -linear_term - sqrt(linear_term**2 - 4 * quadratic_term * constant_term )
		) / (2 * quadratic_term)
		_UpperCamelCase						    =	(
		    -linear_term + sqrt(linear_term**2 - 4 * quadratic_term * constant_term )
		) / (2 * quadratic_term)

		# two solutions, one of which is our input point
		_UpperCamelCase						    =	x_minus if isclose(lowerCAmelCase						,  lowerCAmelCase ) else x_plus
		_UpperCamelCase						    =	point_y + outgoing_gradient * (next_x - point_x)

		return next_x, next_y, outgoing_gradient


def 							__A(lowerCAmelCase = 1.4						,  lowerCAmelCase = -9.6 )		->				int:

		"""simple docstring"""






		_UpperCamelCase						    =	0
		_UpperCamelCase						    =	first_x_coord
		_UpperCamelCase						    =	first_y_coord
		_UpperCamelCase						    =	(10.1 - point_y) / (0.0 - point_x)

		while not (-0.01 <= point_x <= 0.01 and point_y > 0):
				_UpperCamelCase    ,	_UpperCamelCase    ,	_UpperCamelCase						    =	next_point(lowerCAmelCase						,  lowerCAmelCase						,  lowerCAmelCase )
				num_reflections += 1

		return num_reflections


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



