
'''simple docstring'''
from __future__ import annotations

from math import pi, pow




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__       )   ->				float:


		'''simple docstring'''


		if side_length < 0:
				raise ValueError('''vol_cube() only accepts non-negative values'''       )
		return pow(SCREAMING_SNAKE_CASE__      ,    3       )




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       )   ->				float:


		'''simple docstring'''


		if height < 0 or radius < 0:
				raise ValueError('''vol_spherical_cap() only accepts non-negative values'''       )
		# Volume is 1/3 pi * height squared * (3 * radius - height)
		return 1 / 3 * pi * pow(SCREAMING_SNAKE_CASE__      ,    2       ) * (3 * radius - height)




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       )   ->				float:


		'''simple docstring'''


		if radius_a < 0 or radius_a < 0 or centers_distance < 0:
				raise ValueError('''vol_spheres_intersect() only accepts non-negative values'''       )
		if centers_distance == 0:
				return vol_sphere(min(SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       )       )

		snake_case   :    Dict			       =		(
		    (radius_a - radius_a + centers_distance)
		    * (radius_a + radius_a - centers_distance)
		    / (2 * centers_distance)
		)
		snake_case   :    str			       =		(
		    (radius_a - radius_a + centers_distance)
		    * (radius_a + radius_a - centers_distance)
		    / (2 * centers_distance)
		)

		return vol_spherical_cap(SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       ) + vol_spherical_cap(SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       )




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       )   ->				float:


		'''simple docstring'''


		if radius_a <= 0 or radius_a <= 0 or centers_distance < 0:
				raise ValueError(
				    '''vol_spheres_union() only accepts non-negative values, non-zero radius'''       )

		if centers_distance == 0:
				return vol_sphere(max(SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       )       )

		return (
		    vol_sphere(SCREAMING_SNAKE_CASE__       )
		    + vol_sphere(SCREAMING_SNAKE_CASE__       )
		    - vol_spheres_intersect(SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       )
		)




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       )   ->				float:


		'''simple docstring'''


		if width < 0 or height < 0 or length < 0:
				raise ValueError('''vol_cuboid() only accepts non-negative values'''       )
		return float(width * height * length       )




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       )   ->				float:


		'''simple docstring'''


		if height < 0 or area_of_base < 0:
				raise ValueError('''vol_cone() only accepts non-negative values'''       )
		return area_of_base * height / 3.0




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       )   ->				float:


		'''simple docstring'''


		if height < 0 or radius < 0:
				raise ValueError('''vol_right_circ_cone() only accepts non-negative values'''       )
		return pi * pow(SCREAMING_SNAKE_CASE__      ,    2       ) * height / 3.0




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       )   ->				float:


		'''simple docstring'''


		if height < 0 or area_of_base < 0:
				raise ValueError('''vol_prism() only accepts non-negative values'''       )
		return float(area_of_base * height       )




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       )   ->				float:


		'''simple docstring'''


		if height < 0 or area_of_base < 0:
				raise ValueError('''vol_pyramid() only accepts non-negative values'''       )
		return area_of_base * height / 3.0




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__       )   ->				float:


		'''simple docstring'''


		if radius < 0:
				raise ValueError('''vol_sphere() only accepts non-negative values'''       )
		# Volume is 4/3 * pi * radius cubed
		return 4 / 3 * pi * pow(SCREAMING_SNAKE_CASE__      ,    3       )




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__       )   ->				float:


		'''simple docstring'''


		if radius < 0:
				raise ValueError('''vol_hemisphere() only accepts non-negative values'''       )
		# Volume is radius cubed * pi * 2/3
		return pow(SCREAMING_SNAKE_CASE__      ,    3       ) * pi * 2 / 3




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       )   ->				float:


		'''simple docstring'''


		if height < 0 or radius < 0:
				raise ValueError('''vol_circular_cylinder() only accepts non-negative values'''       )
		# Volume is radius squared * height * pi
		return pow(SCREAMING_SNAKE_CASE__      ,    2       ) * height * pi




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       )   ->				float:


		'''simple docstring'''


		if inner_radius < 0 or outer_radius < 0 or height < 0:
				raise ValueError(
				    '''vol_hollow_circular_cylinder() only accepts non-negative values'''       )
		if outer_radius <= inner_radius:
				raise ValueError('''outer_radius must be greater than inner_radius'''       )
		return pi * (pow(SCREAMING_SNAKE_CASE__      ,    2       ) - pow(SCREAMING_SNAKE_CASE__      ,    2       )) * height




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       )   ->				float:


		'''simple docstring'''


		if radius_a < 0 or radius_a < 0 or height < 0:
				raise ValueError('''vol_conical_frustum() only accepts non-negative values'''       )
		return (
		    1
		    / 3
		    * pi
		    * height
		    * (pow(SCREAMING_SNAKE_CASE__      ,    2       ) + pow(SCREAMING_SNAKE_CASE__      ,    2       ) + radius_a * radius_a)
		)




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__      ,    SCREAMING_SNAKE_CASE__       )   ->				float:


		'''simple docstring'''


		if torus_radius < 0 or tube_radius < 0:
				raise ValueError('''vol_torus() only accepts non-negative values'''       )
		return 2 * pow(SCREAMING_SNAKE_CASE__      ,    2       ) * torus_radius * pow(SCREAMING_SNAKE_CASE__      ,    2       )




def 					_UpperCamelCase		(    )   ->				Optional[Any]:


		'''simple docstring'''


		print('''Volumes:'''       )
		print(F'Cube: {vol_cube(2       ) = }'       )  # = 8
		print(F'Cuboid: {vol_cuboid(2      ,    2      ,    2       ) = }'       )  # = 8
		print(F'Cone: {vol_cone(2      ,    2       ) = }'       )  # ~= 1.33
		print(F'Right Circular Cone: {vol_right_circ_cone(2      ,    2       ) = }'       )  # ~= 8.38
		print(F'Prism: {vol_prism(2      ,    2       ) = }'       )  # = 4
		print(F'Pyramid: {vol_pyramid(2      ,    2       ) = }'       )  # ~= 1.33
		print(F'Sphere: {vol_sphere(2       ) = }'       )  # ~= 33.5
		print(F'Hemisphere: {vol_hemisphere(2       ) = }'       )  # ~= 16.75
		print(F'Circular Cylinder: {vol_circular_cylinder(2      ,    2       ) = }'       )  # ~= 25.1
		print(F'Torus: {vol_torus(2      ,    2       ) = }'       )  # ~= 157.9
		print(F'Conical Frustum: {vol_conical_frustum(2      ,    2      ,    4       ) = }'       )  # ~= 58.6
		print(F'Spherical cap: {vol_spherical_cap(1      ,    2       ) = }'       )  # ~= 5.24
		print(F'Spheres intersetion: {vol_spheres_intersect(2      ,    2      ,    1       ) = }'       )  # ~= 21.21
		print(F'Spheres union: {vol_spheres_union(2      ,    2      ,    1       ) = }'       )  # ~= 45.81
		print(
		    F'Hollow Circular Cylinder: {vol_hollow_circular_cylinder(1      ,    2      ,    3       ) = }'       )  # ~= 28.3


if __name__ == "__main__":
						main()




'''simple docstring'''
import bsa
import requests




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__       )   ->				dict[str, str]:


		'''simple docstring'''


		return {
		    "name": soup.ha.a.text,
		    "genre": soup.find('''span'''      ,    class_='''genre'''       ).text.strip(),
		    "rating": soup.strong.text,
		    "page_link": F'https://www.imdb.com{soup.a.get("href"       )}',
		}




def 					_UpperCamelCase		(    SCREAMING_SNAKE_CASE__ = 5       )   ->				tuple:


		'''simple docstring'''


		snake_case   :    List[Any]			       =		int(float(SCREAMING_SNAKE_CASE__       )       )
		if num_movies < 1:
				return ()
		snake_case   :    int			       =		(
		    '''https://www.imdb.com/search/title?title_type='''
		    F'feature&sort=num_votes,desc&count={num_movies}'
		)
		snake_case   :    Optional[Any]			       =		bsa.BeautifulSoup(requests.get(SCREAMING_SNAKE_CASE__       ).content      ,    '''html.parser'''       )
		return tuple(
		    get_movie_data_from_soup(SCREAMING_SNAKE_CASE__       )
		    for movie in source.find_all('''div'''      ,    class_='''lister-item mode-advanced'''       )       )


if __name__ == "__main__":
						import json

						lowercase__		    =	int(input("How many movies would you like to see? "))
						print(
						    ", ".join(
						        json.dumps(movie, indent=4) for movie in get_imdb_top_movies(num_movies)
						    )
						)


