"""simple docstring"""
from __future__ import annotations

from math import pi
from typing import Protocol

import matplotlib.pyplot as plt
import numpy as np



class 					lowerCAmelCase_      (     lowerCAmelCase   ):



				"""simple docstring"""

				def 						snake_case	(			self						,      lowerCAmelCase      ):






										"""simple docstring"""

										return 0.0





def 				lowerCAmelCase__      (     _UpperCamelCase    :			np.ndarray	,     _UpperCamelCase    :			int   )   ->			tuple[int | float, int | float]:





						"""simple docstring"""






						snake_case        =     min([-2_0, np.min(fft_results[1 : samplerate // 2 - 1]   )]   )
						snake_case        =     max([2_0, np.max(fft_results[1 : samplerate // 2 - 1]   )]   )
						return lowest, highest





def 				lowerCAmelCase__      (     _UpperCamelCase    :			FilterType	,     _UpperCamelCase    :			int   )   ->			None:





						"""simple docstring"""






						snake_case        =     5_1_2
						snake_case        =     [1] + [0] * (size - 1)
						snake_case        =     [filter_type.process(_UpperCamelCase   ) for item in inputs]

						snake_case        =     [0] * (samplerate - size)  # zero-padding
						outputs += filler
						snake_case        =     np.abs(np.fft.fft(_UpperCamelCase   )   )
						snake_case        =     2_0 * np.logaa(_UpperCamelCase   )

						# Frequencies on log scale from 24 to nyquist frequency
						plt.xlim(2_4	,     samplerate / 2 - 1   )
						plt.xlabel('Frequency (Hz)'   )
						plt.xscale('log'   )

						# Display within reasonable bounds
						snake_case        =     get_bounds(_UpperCamelCase	,     _UpperCamelCase   )
						plt.ylim(max([-8_0, bounds[0]]   )	,     min([8_0, bounds[1]]   )   )
						plt.ylabel('Gain (dB)'   )

						plt.plot(_UpperCamelCase   )
						plt.show()





def 				lowerCAmelCase__      (     _UpperCamelCase    :			FilterType	,     _UpperCamelCase    :			int   )   ->			None:





						"""simple docstring"""






						snake_case        =     5_1_2
						snake_case        =     [1] + [0] * (size - 1)
						snake_case        =     [filter_type.process(_UpperCamelCase   ) for item in inputs]

						snake_case        =     [0] * (samplerate - size)  # zero-padding
						outputs += filler
						snake_case        =     np.angle(np.fft.fft(_UpperCamelCase   )   )

						# Frequencies on log scale from 24 to nyquist frequency
						plt.xlim(2_4	,     samplerate / 2 - 1   )
						plt.xlabel('Frequency (Hz)'   )
						plt.xscale('log'   )

						plt.ylim(-2 * pi	,     2 * pi   )
						plt.ylabel('Phase shift (Radians)'   )
						plt.plot(np.unwrap(_UpperCamelCase	,     -2 * pi   )   )
						plt.show()



"""simple docstring"""
def 				lowerCAmelCase__      (     _UpperCamelCase    :			str   )   ->			bool:





						"""simple docstring"""






						if not all(x.isalpha() for x in string   ):
												raise ValueError('String must only contain alphabetic characters.'   )

						snake_case        =     sorted(string.lower()   )
						return len(_UpperCamelCase   ) == len(set(_UpperCamelCase   )   )


if __name__ == "__main__":
					SCREAMING_SNAKE_CASE__   =					input("Enter a string ").strip()

					SCREAMING_SNAKE_CASE__   =					is_isogram(input_str)
					print(f"""{input_str} is {'an' if isogram else 'not an'} isogram.""")


