






import functools
from math import sqrt
from time import time

def 			__lowerCamelCase     (						snake_case__			,*snake_case__			,**snake_case__						)				->    Any:






						"""simple docstring"""





						_SCREAMING_SNAKE_CASE       =    time()
						_SCREAMING_SNAKE_CASE       =    func(*snake_case__			,**snake_case__						)
						_SCREAMING_SNAKE_CASE       =    time()
						if int(end - start						) > 0:
												print(F'{func.__name__} runtime: {(end - start):0.4f} s'						)
						else:
												print(F'{func.__name__} runtime: {(end - start) * 10_00:0.4f} ms'						)
						return output

def 			__lowerCamelCase     (						snake_case__						)				->    list[int]:






						"""simple docstring"""





						if n < 0:
												raise Exception("""n is negative"""						)
						if n == 0:
												return [0]
						_SCREAMING_SNAKE_CASE       =    [0, 1]
						for _ in range(n - 1						):
												fib.append(fib[-1] + fib[-2]						)
						return fib

def 			__lowerCamelCase     (						snake_case__						)				->    list[int]:






						"""simple docstring"""





						def fib_recursive_term(snake_case__						) -> int:
												if i < 0:
																		raise Exception("""n is negative"""						)
												if i < 2:
																		return i
												return fib_recursive_term(i - 1						) + fib_recursive_term(i - 2						)

						if n < 0:
												raise Exception("""n is negative"""						)
						return [fib_recursive_term(snake_case__						) for i in range(n + 1						)]

def 			__lowerCamelCase     (						snake_case__						)				->    list[int]:






						"""simple docstring"""





						@functools.cache
						def fib_recursive_term(snake_case__						) -> int:
												if i < 0:
																		raise Exception("""n is negative"""						)
												if i < 2:
																		return i
												return fib_recursive_term(i - 1						) + fib_recursive_term(i - 2						)

						if n < 0:
												raise Exception("""n is negative"""						)
						return [fib_recursive_term(snake_case__						) for i in range(n + 1						)]

def 			__lowerCamelCase     (						snake_case__						)				->    list[int]:






						"""simple docstring"""





						if n < 0:
												raise Exception("""n is negative"""						)
						# Cache must be outside recursuive function
						# other it will reset every time it calls itself.
						_SCREAMING_SNAKE_CASE       =    {0: 0, 1: 1, 2: 1}  # Prefilled cache

						def rec_fn_memoized(snake_case__						) -> int:
												if num in cache:
																		return cache[num]

												_SCREAMING_SNAKE_CASE       =    rec_fn_memoized(num - 1						) + rec_fn_memoized(num - 2						)
												_SCREAMING_SNAKE_CASE       =    value
												return value

						return [rec_fn_memoized(snake_case__						) for i in range(n + 1						)]

def 			__lowerCamelCase     (						snake_case__						)				->    list[int]:






						"""simple docstring"""





						if n < 0:
												raise Exception("""n is negative"""						)
						if n >= 14_75:
												raise Exception("""n is too large"""						)
						_SCREAMING_SNAKE_CASE       =    sqrt(5						)
						_SCREAMING_SNAKE_CASE       =    (1 + sqrt_a) / 2
						return [round(phi**i / sqrt_a						) for i in range(n + 1						)]


if __name__ == "__main__":
		UpperCamelCase												=      30
		time_func(fib_iterative, num)
		time_func(fib_recursive, num)  # Around 3s runtime
		time_func(fib_recursive_cached, num)  # Around 0ms runtime
		time_func(fib_memoization, num)
		time_func(fib_binet, num)









from __future__ import annotations

from string import ascii_letters

def 			__lowerCamelCase     (						snake_case__			,snake_case__			,snake_case__ = None						)				->    str:






						"""simple docstring"""





						_SCREAMING_SNAKE_CASE       =    alphabet or ascii_letters

						# The final result string
						_SCREAMING_SNAKE_CASE       =    """"""

						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
																		_SCREAMING_SNAKE_CASE       =    (alpha.index(snake_case__						) + key) % len(snake_case__						)

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

						return result

def 			__lowerCamelCase     (						snake_case__			,snake_case__			,snake_case__ = None						)				->    str:






						"""simple docstring"""





						key *= -1

						return encrypt(snake_case__			,snake_case__			,snake_case__						)

def 			__lowerCamelCase     (						snake_case__			,snake_case__ = None						)				->    dict[int, str]:






						"""simple docstring"""





						_SCREAMING_SNAKE_CASE       =    alphabet or ascii_letters

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

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

						return brute_force_data


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

				# get user input
				UpperCamelCase												=      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":
						UpperCamelCase												=      input('''Please enter the string to be encrypted: ''')
						UpperCamelCase												=      int(input('''Please enter off-set: ''').strip())

						print(encrypt(input_string, key))
				elif choice == "2":
						UpperCamelCase												=      input('''Please enter the string to be decrypted: ''')
						UpperCamelCase												=      int(input('''Please enter off-set: ''').strip())

						print(decrypt(input_string, key))
				elif choice == "3":
						UpperCamelCase												=      input('''Please enter the string to be decrypted: ''')
						UpperCamelCase												=      brute_force(input_string)

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

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

