Ответы пользователя по тегу Python
  • Объясните код шифра табличной маршрутной перестановки?

    Certik
    @Certik
    def enc(text):
        #определяем размеры сетки. Если размер текста меньше 25и символов, то берем сетку 5х5.
        # Иначе берем корень из размера текста и округляем вверх — это будет сторона сетки.
        # можно в принципе упростить до n=max(5, math.ceil(math.sqrt(len(text))))
        if math.sqrt(len(text)) <= 5:
            n = 5
        else: 
            n = math.ceil(math.sqrt(len(text)))
        
        # создаем массив массивов символов '_' — это наша сетка
        # можно упростить до a = [['_']*n]*n
        a = ['_'] * n
        for i in range(n):
            a[i] = ['_'] * n
    
        # в тексте меняем проблелы на подчеркивания
        text = text.replace(' ', '_')
        # и устанавливаем счетчик на ноль.
        t = 0
    
        # для каждого i от 0 до n
        for i in range(0, n):
            # для каждого j от (0 для четных i, n-1 для нечетных) до (n для четных i, -1 для нечетных) c шагом (1 для четных, -1 для нечетных)
            # то есть для четных i берем j от 0 до n-1, а для нечетных — от n до -1.
            # вероятно я обсчиталась и для нечетных должно быть от n-1 до 0. Но мне лень пересчитывать. Извините.
            for j in range(n * (i % 2) - i % 2,  n * ((i + 1) % 2)  - i % 2, 1 - (i % 2) * 2):
                 # если текст еще не закончился
                if t < len(text):
                    # берем следующую его букву (по счетчику, который мы там в начале установили в 0) и вставляем в сетку на место [j][i].
                    # То есть получается записываем текст в таблицу змейкой, сначала сверху вниз, потом снизу вверх, потом сверху вниз... пока текст не закончится
                    a[j][i] = text[t]
                    # прибавляем счетчик
                    t += 1
    
        # создаем пустую строку (ой, это зря, ну да ладно)
        enctext = ''
    
        # прибавляем к пустой строке по порядку строки нашей таблицы.
        # Это очень неэффективно т.к. при каждом добавлении по факту создается новая строчка.
        # стоило написать что-то вроде ''.join(''.join(row) for row in a)
        for i in range(n):
            for j in range(n):
                enctext += a[i][j]
        # возвращаем получившуюся строчку
        return enctext
    
    def dec(text):
        # определяем размер сетки как в первой функции
        if math.sqrt(len(text)) <= 5:
            n = 5
        else: 
            n = math.ceil(math.sqrt(len(text)))
    
        # создаем пустую сетку
        a = ['_'] * n
        for i in range(n):
            a[i] = ['_'] * n
    
        t = 0
        # заполняем ее по порядку
        for i in range(n):
            for j in range(n):
                if t < len(text):
                    a[i][j] = text[t]
                    t += 1
        
        dectext = ''
    
        # читаем змейкой сверху вниз, потом снизу вверх и тд
        for i in range(0, n):
            for j in range(n * (i % 2) - i % 2,  n * ((i + 1) % 2)  - i % 2, 1 - (i % 2) * 2):
                dectext += a[j][i]
        # меняем подчеркивания на проблеы и обрезаем лишнее.
        dectext = dectext.replace('_', ' ').strip()
        return dectext
        
        
    # это просто тестовый код. Энкодим, печатаем, декодим, печатаем. Ничего сложного.
    print("Шифрованный текст: " + enc(text))
    print("Дешифрованный текст: " + dec(enc(text)))
    Ответ написан
    Комментировать
  • Как сделать так, чтоб телеграм бот переподключался к интернету до тех пор пока он не появится, а не выключался?

    Certik
    @Certik
    Обернуть во что-то типа
    failed = true
    while failed: 
        try:
            #запрос
            failed = false
        except: # тут желательно ограничить набор ловимых эксепшнов
            # не знаю, залогировать, счетчик прибавить, что хотите

    Это будет долбиться вечно и без перерыва. Если нужно ограничение попыток, добавьте счетчик оных. Если есть смысл в задержке перед следующей попыткой, поставьте sleep (не помню как в питоне, но это должно легко гуглиться).
    Ответ написан
    Комментировать