我正处于我的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
答案 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作为属性,因此您可以省去管理全局变量的麻烦,并且可以同时使用多个密码。