为什么这个代码适用于索引超过16的任何字母表?

2024-09-29 03:35:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我不明白为什么这个代码对“p”之后的任何字母都有效,但它确实有效,因为我们使用了%

alphabet = "abcdefghijklmnopqrstuvwxyz"
punctuation = ".,?'! "
message = "xuo jxuhu! jxyi yi qd unqcfbu ev q squiqh syfxuh. muhu oek qrbu je tusetu yj? y xefu ie! iudt cu q cuiiqwu rqsa myjx jxu iqcu evviuj!"

translated_message = ""

for letter in message:
    if not letter in punctuation:
        letter_value = alphabet.find(letter)
        translated_message += alphabet[(letter_value + 10) % 26]
    else:
        translated_message += letter
print(translated_message)

Tags: 代码inmessagevalue字母letterpunctuationalphabet
2条回答

任何大于15的字母索引将生成大于或等于26的相应索引(+10)。模运算符(%)将使索引返回到26以下(基本上在26个字母内环绕)

模是整数除法的余数。例如,如果原始字母在索引19处,那么你将用29除以26,得到1的商和3的余数。这将为您提供字母[3]作为相应的字母值<;而不是0

简言之,模26的任何数字将产生小于26且大于零的值(在字母表的指数化范围内)

请注意,程序不需要检查标点符号,.find()函数将返回-1,如果它在字母表中找不到字母,那么您可以检查字母_值>;=0来执行转换

此外,考虑到偏移量小于26,您可以简单地将字母字符串加倍,并避免完全使用模:

alphabet = "abcdefghijklmnopqrstuvwxyz" * 2   # allow indexes > 26
for letter in message:
    letter_value = alphabet.find(letter)      # will find 1st occurrence
    if letter_value >= 0:                     # if it is in alphabet
        letter = alphabet[letter_value + 10]  # then translate it
    translated_message += letter              # assemble result

如果以后您想反转翻译,可以反转字母表并按原样使用其余代码

alphabet = "abcdefghijklmnopqrstuvwxyz" * 2   # allow indexes > 26

if decoding: alphabet = alphabet[::-1]        # reverse alphabet to decode

for letter in message:
    letter_value = alphabet.find(letter)      # will find 1st occurrence
    if letter_value >= 0:                     # if it is in alphabet
        letter = alphabet[letter_value + 10]  # then translate it
    translated_message += letter              # assemble result

凯撒密码是一个非常好的密码。它计算出前15个字母等于letter_position + 10。但是我完全理解你在使用%符号时的困惑

但让我来解释一下数学:

对于前15个字母,对应的字母是其在字母表中的位置加上10个点。让我们以字母i为例

#'i' is the 8th letter of the alphabet
letter = 'i'
pos = 8

translated_pos = pos + 10
#translated_pos = 18

这就是%的作用所在。 尽管将其放入计算器,您会发现结果除法18 / 26的结果是一个小数字,小于1

这是使用模规则之一的地方:

Let *a mod b*
Where *b > a > 0* then *a mod b = a*

这意味着对于所有小于16的数字(当加上10时小于26),它在字母表中的位置相同

现在对于代码中p之后的任何字母: 模计算实际上非常简单

让我们以字母w为例

#'w' is the 22nd letter of the alphabet.
letter = 'w'
pos = 22

translated_pos = pos + 10
#translated_pos = 32

要找到32的mod 26,从32中减去26,直到得到的数字小于0(等于零就可以了)。剩下多少是你的模方程的答案

start = 32
step = 26

32 - 26 = 6
6 - 26 = -20 #Too far

#This gives the corresponding letter of 22 (w) to 6 (g) the remainder of the first equation

如果您想更轻松地编写自己的消息,我使用python制作了一个快速字典

alphabet = " abcdefghijklmnopqrstuvwxyz"
message = "abcdefghijklmnopqrstuvwxyz"


for letter in message:
    letter_value = alphabet.find(letter)
    print(letter_value, letter, (letter_value+10) % 26, alphabet[(letter_value + 10) % 26])

相关问题 更多 >