Ivan753 / mirea-work-7s

1 stars 0 forks source link

КОД #2

Closed kzagorulko closed 4 years ago

kzagorulko commented 4 years ago

https://github.com/Ivan753/mirea-work-7s/blob/653267d651ab3eae0db8b1ad2b5422fe4bb50c7d/is/playfair_chiper.py#L3

ALPHABET = [
    'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З', 'И', 'К', 'Л', 'М', 'Н', 'О', 'П',
    'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Э', 'Ю', 'Я',
]

SYMBOL = 'А'

SYMBOLS_FOR_REPLACE = {'Ь': 'Ъ', 'Й': 'И', 'Ё': 'Е'}

def replace_symbols(symbol):
    return (
        symbol in SYMBOLS_FOR_REPLACE and SYMBOLS_FOR_REPLACE[symbol] or symbol
    )

def make_matrix(word):
    word_in_list = [replace_symbols(b) for b in word]
    alphabet = word_in_list + list(
        filter(lambda b: b not in word_in_list, ALPHABET)
    )

    while len(alphabet) > 0:
        yield alphabet[:6]
        alphabet = alphabet[6:]

def get_row_and_column(letter, matrix):
    i = 0
    while letter not in matrix[i]:
        i += 1
    return i, matrix[i].index(letter)

def get_dual(dual, matrix, action):
    if action == 'encrypt':
        foo = 1
    elif action == 'decrypt':
        foo = -1
    else:
        raise ValueError

    def _get_letter_info(letter):
        row, column = get_row_and_column(letter, matrix)
        return {
            'letter': letter,
            'row': row,
            'column': column,
        }

    first_letter = _get_letter_info(dual[0])
    second_letter = _get_letter_info(len(dual) > 1 and dual[1] or SYMBOL)

    if first_letter['row'] == second_letter['row']:
        def _calc(_column):
            return (_column + 6 + foo) % 6
        return (
            matrix[first_letter['row']][_calc(first_letter['column'])]
            + matrix[second_letter['row']][_calc(second_letter['column'])]
        )
    elif first_letter['column'] == second_letter['column']:
        def _calc(row):
            return (row + 5 + foo) % 5
        return (
            matrix[_calc(first_letter['row'])][first_letter['column']]
            + matrix[_calc(second_letter['row'])][second_letter['column']]
        )
    return (
        matrix[first_letter['row']][second_letter['column']]
        + matrix[second_letter['row']][first_letter['column']]
    )

def main():
    alphabet_set = set(ALPHABET + list(SYMBOLS_FOR_REPLACE.keys()))

    key_word = input('Введите кодовое слово: ')
    key_word_set = set(key_word)
    if not key_word_set.issubset(alphabet_set):
        raise ValueError('Кодовое слово содержит недопустимые символы')
    if len(key_word) != len(key_word_set):
        raise ValueError('Кодовое слово содержит повторяющиеся символы')

    encrypted_text = [replace_symbols(s) for s in input('Введите текст: ')]
    if not set(encrypted_text).issubset(alphabet_set):
        raise ValueError('Текст содержит недопустимые символы')
    if len(encrypted_text) % 2 == 1:
        raise ValueError('Некорректная длинна текста')

    matrix = list(make_matrix(key_word))

    spliced_text = [
        encrypted_text[i:i + 2] for i in range(0, len(encrypted_text), 2)
    ]

    for dual in spliced_text:
        print(get_dual(dual, matrix, 'decrypt'), end='')

    print()

    decrypted_text = [
        replace_symbols(s) for s in input('Введите текст для шифрования: ')
    ]
    if not set(decrypted_text).issubset(alphabet_set):
        raise ValueError('Текст содержит недопустимые символы')
    spliced_text = [
        decrypted_text[i:i + 2] for i in range(0, len(decrypted_text), 2)
    ]

    for dual in spliced_text:
        print(get_dual(dual, matrix, 'encrypt'), end='')

if __name__ == '__main__':
    try:
        main()
    except ValueError as e:
        print(e)
Ivan753 commented 4 years ago
jagerwil commented 4 years ago

image fooooooo

jagerwil commented 4 years ago

image image Здесь для понимания надо реально посидеть и повтыкать, выглядит монструозно ебана рот (за мат извени)

jagerwil commented 4 years ago

image и тут прибегает почта россии

jagerwil commented 4 years ago

image так стоп, а зачем дуал получать, вот же он

jagerwil commented 4 years ago

image Природа настолько очистилась, что скобочки с лиспа вернулись в питон

kzagorulko commented 4 years ago

image image Здесь для понимания надо реально посидеть и повтыкать, выглядит монструозно ебана рот (за мат извени)

во что? Не знаешь как работает and и or? и как списки складываются?

jagerwil commented 4 years ago

понимаю, но это выглядит страшно

image image Здесь для понимания надо реально посидеть и повтыкать, выглядит монструозно ебана рот (за мат извени)

во что? Не знаешь как работает and и or? и как списки складываются?

kzagorulko commented 4 years ago

понимаю, но это выглядит страшно

image image Здесь для понимания надо реально посидеть и повтыкать, выглядит монструозно ебана рот (за мат извени)

во что? Не знаешь как работает and и or? и как списки складываются?

это энд и ор, это мировая практика Понимаю, сложение листов обычно делают через жопу, но так можно

kzagorulko commented 4 years ago

image Природа настолько очистилась, что скобочки с лиспа вернулись в питон

image

jagerwil commented 4 years ago

image Природа настолько очистилась, что скобочки с лиспа вернулись в питон

image

я ваньку это тоже говорил

jagerwil commented 4 years ago

image Не совсем понятно, для чего вообще alphabet_set, ведь у тебя уже есть функция replace_symbols, которая может конвертировать вводную строку в строку, в которой содержатся только символы из алфавита

jagerwil commented 4 years ago

Еще непонятно, для чего внизу этого скрина нужна проверка на недопустимые символы

kzagorulko commented 4 years ago

image Не совсем понятно, для чего вообще alphabet_set, ведь у тебя уже есть функция replace_symbols, которая может конвертировать вводную строку в строку, в которой содержатся только символы из алфавита

а если приедет нелегальный символ типа R или пробел? Плюс это множество включает все легальные символы

kzagorulko commented 4 years ago

Еще непонятно, для чего внизу этого скрина нужна проверка на недопустимые символы

защита от дурака

jagerwil commented 4 years ago

image Не совсем понятно, для чего вообще alphabet_set, ведь у тебя уже есть функция replace_symbols, которая может конвертировать вводную строку в строку, в которой содержатся только символы из алфавита

а если приедет нелегальный символ типа R или пробел? Плюс это множество включает все легальные символы

можно для key_word сделать replace_symbols, а потом проверить key_word на то, являются ли его буквы частью списка ALPHABET. Тогда alphabet_set вообще не нужен

kzagorulko commented 4 years ago

оно по логике не может содержать этих букв, насколько я понимаю

jagerwil commented 4 years ago

пофиксил предыдущий коммент

jagerwil commented 4 years ago

пофиксил предыдущий коммент о том, что пофиксил предпредыдущий коммент

Ivan753 commented 4 years ago

Работаем дальше

kzagorulko commented 4 years ago

Ладно