Playfair密码不会将字母打印到5x5表

时间:2015-10-25 21:19:43

标签: python

我正处于我的playfair密码的开始阶段。我想把钥匙和字母打印到盒子上。但是我遇到了困难,只能使用" *"打印5x5表。

对于那些不熟悉游戏公钥密码的人,规则是打印一个密钥,例如"数学"与字母表的其余部分一起放入5x5表格中,每个字母只出现一次。我正在使用列表列表并迭代列表的每个元素。当我认为它已将所有字母存储回列表中时,我得到的结果是" *"'而不是5x5字母表的5x5表。这是我正在使用的代码。我该如何解决这个问题?

alphabet = "abcdefghiklmnopqrstuvwxyz"

#no j

# Initialize a 5 by 5 table of stars
table = []

def print_table():
    for row in range(5):
        for col in range(5):
            print(table[row][col],end="")
        print("")

def clear_table():
    for row in range(5):
        table.append([])
        for col in range(5):
            table[row].append("*")

# This was added by
def find_letter(letter):
        for row in range(5):
            for col in range(5):
                if table[row][col] == letter:
                    return row, col
        return -1, -1

def table_has_letter(letter):
    return find_letter(letter)[0] != -1
    # Write code here to search the table for the given letter
    # and return True or False depending on if the letter exists

def table_next_opening():
    return find_letter("*")

def table_insert_letter(letter):
    letter=letter.upper()
    letter= "I" if letter == "J" else letter
    if letter in alphabet and not table_has_letter(letter):
        open_pos= table_next_opening()
        table[open_pos[0]][open_pos[1]] = letter
        ww = open_pos
        return (ww)

def create_table(secret):
    clear_table()
    for letter in secret:
        table_insert_letter(letter)
    for ex_letter in  alphabet:
        table_insert_letter(ex_letter)

create_table("Mathematics")
print_table()

print("")

create_table("Playfair example")
print_table()  # Should match wikipedia

1 个答案:

答案 0 :(得分:0)

在您的函数table_insert_letter中,您将输入字母转换为大写字母,然后尝试在alphabet中找到它。 alphabet字符串仅包含小写字符。如果您使用大写alphabet或将输入字母转换为小写字母(使用str.lower()),则可以使用。

编辑:要使您的第二个示例正常工作,您还需要查看clear_table功能。它没有按预期工作,因为你没有丢弃旧表。试试这个:

def clear_table():
    global table
    table = []
    for row in range(5):
        table.append([])
        for col in range(5):
            table[row].append("*")

在我看来,这也是一个编写类的好地方,以table作为属性,因此您可以省去管理全局变量的麻烦,并且可以同时使用多个密码。