


def        UpperCamelCase_(				_A   :str = "The quick brown fox jumps over the lazy dog"				,     )->		bool:
			UpperCamelCase__					=       set()

			# Replace all the whitespace in our sentence
			UpperCamelCase__					=       input_str.replace(" "				,     ""  )
			for alpha in input_str:
						if "a" <= alpha.lower() <= "z":
									frequency.add(alpha.lower()  )
			return len(_A  ) == 26
def        UpperCamelCase_(				_A   :str = "The quick brown fox jumps over the lazy dog"				,     )->		bool:
			UpperCamelCase__					=       [False] * 26
			for char in input_str:
						if char.islower():
									UpperCamelCase__					=       True
						elif char.isupper():
									UpperCamelCase__					=       True
			return all(_A  )
def        UpperCamelCase_(				_A   :str = "The quick brown fox jumps over the lazy dog"				,     )->		bool:
			return len({char for char in input_str.lower() if char.isalpha()}  ) == 26
def        UpperCamelCase_(				)->		None:
			from timeit import timeit

			UpperCamelCase__					=       "from __main__ import is_pangram, is_pangram_faster, is_pangram_fastest"
			print(timeit("is_pangram()"				,     setup=_A  )  )
			print(timeit("is_pangram_faster()"				,     setup=_A  )  )
			print(timeit("is_pangram_fastest()"				,     setup=_A  )  )
			# 5.348480500048026, 2.6477354579837993, 1.8470395830227062
			# 5.036091582966037, 2.644472333951853,  1.8869528750656173


if __name__ == "__main__":
						import doctest

						doctest.testmod()
						benchmark()






def        UpperCamelCase_(				_A   :str  )->		str:
			UpperCamelCase__					=       ""
			for ch in key:
						if ch == " " or ch not in key_no_dups and ch.isalpha():
									key_no_dups += ch
			return key_no_dups
def        UpperCamelCase_(				_A   :str  )->		dict[str, str]:
			UpperCamelCase__					=       [chr(i + 65  ) for i in range(26  )]
			# Remove duplicate characters from key
			UpperCamelCase__					=       remove_duplicates(key.upper()  )
			UpperCamelCase__					=       len(_A  )
			# First fill cipher with key characters
			UpperCamelCase__					=       {alphabet[i]: char for i, char in enumerate(_A  )}
			# Then map remaining characters in alphabet to
			# the alphabet from the beginning
			for i in range(len(_A  )				,     26  ):
						UpperCamelCase__					=       alphabet[i - offset]
						# Ensure we are not mapping letters to letters previously mapped
						while char in key:
									offset -= 1
									UpperCamelCase__					=       alphabet[i - offset]
						UpperCamelCase__					=       char
			return cipher_alphabet
def        UpperCamelCase_(				_A   :str				,     _A   :dict[str, str]  )->		str:
			return "".join(cipher_map.get(_A				,     _A  ) for ch in message.upper()  )
def        UpperCamelCase_(				_A   :str				,     _A   :dict[str, str]  )->		str:
			UpperCamelCase__					=       {v: k for k, v in cipher_map.items()}
			return "".join(rev_cipher_map.get(_A				,     _A  ) for ch in message.upper()  )
def        UpperCamelCase_(				)->		None:
			UpperCamelCase__					=       input("Enter message to encode or decode: "  ).strip()
			UpperCamelCase__					=       input("Enter keyword: "  ).strip()
			UpperCamelCase__					=       input("Encipher or decipher? E/D:"  ).strip()[0].lower()
			try:
						UpperCamelCase__					=       {"e": encipher, "d": decipher}[option]
			except KeyError:
						raise KeyError("invalid input option"  )
			UpperCamelCase__					=       create_cipher_map(_A  )
			print(func(_A				,     _A  )  )


if __name__ == "__main__":
						import doctest

						doctest.testmod()
						main()


