




from __future__ import annotations

from string import ascii_letters



def     lowerCAmelCase		(		_lowerCAmelCase				: str    ,				_lowerCAmelCase				: int    ,				_lowerCAmelCase				: str | None = None						):




 """simple docstring"""







 UpperCAmelCase__							=    alphabet or ascii_letters

 # The final result string
 UpperCAmelCase__							=    ""

 for character in input_string:
  if character not in alpha:
   # Append without encryption if character is not in the alphabet
   result += character
  else:
   # Get the index of the new key and make sure it isn't too large
   UpperCAmelCase__							=    (alpha.index(_lowerCAmelCase						) + key) % len(_lowerCAmelCase						)

   # Append the encoded character to the alphabet
   result += alpha[new_key]

 return result



def     lowerCAmelCase		(		_lowerCAmelCase				: str    ,				_lowerCAmelCase				: int    ,				_lowerCAmelCase				: str | None = None						):




 """simple docstring"""







 key *= -1

 return encrypt(_lowerCAmelCase    ,				_lowerCAmelCase    ,				_lowerCAmelCase						)



def     lowerCAmelCase		(		_lowerCAmelCase				: str    ,				_lowerCAmelCase				: str | None = None						):




 """simple docstring"""







 UpperCAmelCase__							=    alphabet or ascii_letters

 # To store data on all the combinations
 UpperCAmelCase__							=    {}

 # Cycle through each combination
 for key in range(1    ,				len(_lowerCAmelCase						) + 1						):
  # Decrypt the message and store the result in the data
  UpperCAmelCase__							=    decrypt(_lowerCAmelCase    ,				_lowerCAmelCase    ,				_lowerCAmelCase						)

 return brute_force_data


if __name__ == "__main__":
  while True:
    print(F'''\n{"-" * 1_0}\n Menu\n{"-" * 1_0}''')
    print(*["1.Encrypt", "2.Decrypt", "3.BruteForce", "4.Quit"], sep="\n")

    # get user input
    _lowerCAmelCase    : Tuple		= input("\nWhat would you like to do?: ").strip() or "4"

    # run functions based on what the user chose
    if choice not in ("1", "2", "3", "4"):
      print("Invalid choice, please enter a valid choice")
    elif choice == "1":
      _lowerCAmelCase    : str		= input("Please enter the string to be encrypted: ")
      _lowerCAmelCase    : Optional[Any]		= int(input("Please enter off-set: ").strip())

      print(encrypt(input_string, key))
    elif choice == "2":
      _lowerCAmelCase    : Optional[Any]		= input("Please enter the string to be decrypted: ")
      _lowerCAmelCase    : int		= int(input("Please enter off-set: ").strip())

      print(decrypt(input_string, key))
    elif choice == "3":
      _lowerCAmelCase    : str		= input("Please enter the string to be decrypted: ")
      _lowerCAmelCase    : List[Any]		= brute_force(input_string)

      for key, value in brute_force_data.items():
        print(F'''Key: {key} | Message: {value}''')

    elif choice == "4":
      print("Goodbye.")
      break











from __future__ import annotations

from math import pi, pow



def     lowerCAmelCase		(		_lowerCAmelCase				: int | float						):




 """simple docstring"""







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



def     lowerCAmelCase		(		_lowerCAmelCase				: float    ,				_lowerCAmelCase				: 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(_lowerCAmelCase    ,				2						) * (3 * radius - height)



def     lowerCAmelCase		(		_lowerCAmelCase				: float    ,				_lowerCAmelCase				: float    ,				_lowerCAmelCase				: 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(_lowerCAmelCase    ,				_lowerCAmelCase						)						)

 UpperCAmelCase__							=    (
     (radius_a - radius_a + centers_distance)
     * (radius_a + radius_a - centers_distance)
     / (2 * centers_distance)
 )
 UpperCAmelCase__							=    (
     (radius_a - radius_a + centers_distance)
     * (radius_a + radius_a - centers_distance)
     / (2 * centers_distance)
 )

 return vol_spherical_cap(_lowerCAmelCase    ,				_lowerCAmelCase						) + vol_spherical_cap(_lowerCAmelCase    ,				_lowerCAmelCase						)



def     lowerCAmelCase		(		_lowerCAmelCase				: float    ,				_lowerCAmelCase				: float    ,				_lowerCAmelCase				: 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(_lowerCAmelCase    ,				_lowerCAmelCase						)						)

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



def     lowerCAmelCase		(		_lowerCAmelCase				: float    ,				_lowerCAmelCase				: float    ,				_lowerCAmelCase				: 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     lowerCAmelCase		(		_lowerCAmelCase				: float    ,				_lowerCAmelCase				: 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     lowerCAmelCase		(		_lowerCAmelCase				: float    ,				_lowerCAmelCase				: float						):




 """simple docstring"""







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



def     lowerCAmelCase		(		_lowerCAmelCase				: float    ,				_lowerCAmelCase				: 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     lowerCAmelCase		(		_lowerCAmelCase				: float    ,				_lowerCAmelCase				: 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     lowerCAmelCase		(		_lowerCAmelCase				: 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(_lowerCAmelCase    ,				3						)



def     lowerCAmelCase		(		_lowerCAmelCase				: float						):




 """simple docstring"""







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



def     lowerCAmelCase		(		_lowerCAmelCase				: float    ,				_lowerCAmelCase				: 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(_lowerCAmelCase    ,				2						) * height * pi



def     lowerCAmelCase		(		_lowerCAmelCase				: float    ,				_lowerCAmelCase				: float    ,				_lowerCAmelCase				: 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(_lowerCAmelCase    ,				2						) - pow(_lowerCAmelCase    ,				2						)) * height



def     lowerCAmelCase		(		_lowerCAmelCase				: float    ,				_lowerCAmelCase				: float    ,				_lowerCAmelCase				: 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(_lowerCAmelCase    ,				2						) + pow(_lowerCAmelCase    ,				2						) + radius_a * radius_a)
 )



def     lowerCAmelCase		(		_lowerCAmelCase				: float    ,				_lowerCAmelCase				: float						):




 """simple docstring"""







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



def     lowerCAmelCase		(		):




 """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()





