'''simple docstring'''




import numpy as np
from PIL import Image






def __lowerCAmelCase			(							UpperCamelCase__    ,  UpperCamelCase__    ,  UpperCamelCase__    )     ->   np.ndarray:
    __lowerCamelCase          =  np.array(__UpperCAmelCase    )
    if arr.shape[0] != arr.shape[1]:
        raise ValueError('''The input array is not a square matrix'''    )
    __lowerCamelCase          =  0
    __lowerCamelCase          =  0
    __lowerCamelCase          =  0
    __lowerCamelCase          =  0

    # compute the shape of the output matrix
    __lowerCamelCase          =  (arr.shape[0] - size) // stride + 1
    # initialize the output matrix with zeros of shape maxpool_shape
    __lowerCamelCase          =  np.zeros((maxpool_shape, maxpool_shape)    )

    while i < arr.shape[0]:
        if i + size > arr.shape[0]:
            # if the end of the matrix is reached, break
            break
        while j < arr.shape[1]:
            # if the end of the matrix is reached, break
            if j + size > arr.shape[1]:
                break
            # compute the maximum of the pooling matrix
            __lowerCamelCase          =  np.max(arr[i : i + size, j : j + size]    )
            # shift the pooling matrix by stride of column pixels
            j += stride
            mat_j += 1

        # shift the pooling matrix by stride of row pixels
        i += stride
        mat_i += 1

        # reset the column index to 0
        __lowerCamelCase          =  0
        __lowerCamelCase          =  0

    return updated_arr






def __lowerCAmelCase			(							UpperCamelCase__    ,  UpperCamelCase__    ,  UpperCamelCase__    )     ->   np.ndarray:
    __lowerCamelCase          =  np.array(__UpperCAmelCase    )
    if arr.shape[0] != arr.shape[1]:
        raise ValueError('''The input array is not a square matrix'''    )
    __lowerCamelCase          =  0
    __lowerCamelCase          =  0
    __lowerCamelCase          =  0
    __lowerCamelCase          =  0

    # compute the shape of the output matrix
    __lowerCamelCase          =  (arr.shape[0] - size) // stride + 1
    # initialize the output matrix with zeros of shape avgpool_shape
    __lowerCamelCase          =  np.zeros((avgpool_shape, avgpool_shape)    )

    while i < arr.shape[0]:
        # if the end of the matrix is reached, break
        if i + size > arr.shape[0]:
            break
        while j < arr.shape[1]:
            # if the end of the matrix is reached, break
            if j + size > arr.shape[1]:
                break
            # compute the average of the pooling matrix
            __lowerCamelCase          =  int(np.average(arr[i : i + size, j : j + size]    )    )
            # shift the pooling matrix by stride of column pixels
            j += stride
            mat_j += 1

        # shift the pooling matrix by stride of row pixels
        i += stride
        mat_i += 1
        # reset the column index to 0
        __lowerCamelCase          =  0
        __lowerCamelCase          =  0

    return updated_arr


# Main Function
if __name__ == "__main__":
  from doctest import testmod

  testmod(name="avgpooling", verbose=True)

  # Loading the image
  __UpperCAmelCase												=Image.open("path_to_image")

  # Converting the image to numpy array and maxpooling, displaying the result
  # Ensure that the image is a square matrix

  Image.fromarray(maxpooling(np.array(image), size=3, stride=2)).show()

  # Converting the image to numpy array and averagepooling, displaying the result
  # Ensure that the image is a square matrix

  Image.fromarray(avgpooling(np.array(image), size=3, stride=2)).show()

'''simple docstring'''




__UpperCAmelCase												="ABCDEFGHIJKLMNOPQRSTUVWXYZ"






def __lowerCAmelCase			(							)     ->   None:
    __lowerCamelCase          =  input('''Enter message: '''    )
    __lowerCamelCase          =  input('''Enter key [alphanumeric]: '''    )
    __lowerCamelCase          =  input('''Encrypt/Decrypt [e/d]: '''    )

    if mode.lower().startswith('''e'''    ):
        __lowerCamelCase          =  '''encrypt'''
        __lowerCamelCase          =  encrypt_message(UpperCamelCase__    ,  UpperCamelCase__    )
    elif mode.lower().startswith('''d'''    ):
        __lowerCamelCase          =  '''decrypt'''
        __lowerCamelCase          =  decrypt_message(UpperCamelCase__    ,  UpperCamelCase__    )

    print(f"""\n{mode.title()}ed message:"""    )
    print(UpperCamelCase__    )






def __lowerCAmelCase			(							UpperCamelCase__    ,  UpperCamelCase__    )     ->   str:
    return translate_message(UpperCamelCase__    ,  UpperCamelCase__    ,  '''encrypt'''    )






def __lowerCAmelCase			(							UpperCamelCase__    ,  UpperCamelCase__    )     ->   str:
    return translate_message(UpperCamelCase__    ,  UpperCamelCase__    ,  '''decrypt'''    )






def __lowerCAmelCase			(							UpperCamelCase__    ,  UpperCamelCase__    ,  UpperCamelCase__    )     ->   str:
    __lowerCamelCase          =  []
    __lowerCamelCase          =  0
    __lowerCamelCase          =  key.upper()

    for symbol in message:
        __lowerCamelCase          =  LETTERS.find(symbol.upper()    )
        if num != -1:
            if mode == "encrypt":
                num += LETTERS.find(key[key_index]    )
            elif mode == "decrypt":
                num -= LETTERS.find(key[key_index]    )

            num %= len(UpperCamelCase__    )

            if symbol.isupper():
                translated.append(LETTERS[num]    )
            elif symbol.islower():
                translated.append(LETTERS[num].lower()    )

            key_index += 1
            if key_index == len(UpperCamelCase__    ):
                __lowerCamelCase          =  0
        else:
            translated.append(UpperCamelCase__    )
    return "".join(UpperCamelCase__    )


if __name__ == "__main__":
  main()
