k1 = (is_plaintext3(decrypted_text, word1, word2 ,word3) > k1) ? (is_plaintext3(decrypted_这么写有什么问题text, word1, word2 ,word3)) : k1
时间: 2023-09-18 18:11:23 浏览: 32
这段代码的问题在于,`is_plaintext3`函数被调用了两次,这样会浪费时间和资源。正确的写法应该是:
```c++
int score = is_plaintext3(decrypted_text, word1, word2 ,word3);
k1 = (score > k1) ? score : k1;
```
这样,先将`is_plaintext3`函数的返回结果存入一个变量中,然后再进行比较和赋值操作,避免了重复调用函数。
相关问题
for permutation in matrix_permutations: for i in range(len(mp)): for j in range(len(mp[i])): key[most_common_letters_m[i][permutation[i][j]]] = mf[i][j] if len(key) < len (sorted_letters): for i in range (len(sorted_letters)-len(key)): key.update({sorted_letters[len(key)+i-1]:f7[i]}) decrypted_text = decrypt(cipher_text, key) k1 = is_plaintext3(decrypted_text, word1, word2 ,word3) #k2 = k1 if k1 > k2 else k2 if( k1 > c1): key1 = dict(list(key)[lk1:len(mp[i1])+lk1]) return key1出问题的是这段代码
根据你提供的代码,你需要检查一下 `key` 字典对象的长度是否小于 `sorted_letters` 列表的长度。如果是,那么在 `key` 字典对象中添加缺失的字母和对应的密文字符,以确保 `key` 字典对象的长度与 `sorted_letters` 列表的长度相同。
在你的代码中,添加缺失字母的部分是:
```
if len(key) < len(sorted_letters):
for i in range(len(sorted_letters) - len(key)):
key.update({sorted_letters[len(key) + i - 1]: f7[i]})
```
其中,`key.update()` 方法用于在 `key` 字典对象中添加新的键值对。但是,由于你使用了 `sorted_letters[len(key) + i - 1]` 来作为新键的名称,这可能会导致索引越界或者键重复等问题。你可以使用 `enumerate()` 函数来遍历 `f7` 列表,并使用 `sorted_letters[i]` 作为新键的名称,修改后的代码如下:
```
if len(key) < len(sorted_letters):
for i, val in enumerate(f7):
key[sorted_letters[i]] = val
```
这样就可以避免出现索引越界或者键重复等问题了。
def guess_key3(cipher_text, word1, word2, word3): #变了点 letter_frequency = get_letter_frequency(cipher_text.lower()) excluded_letters = [letter for letter in letter_frequency.keys() if letter_frequency[letter] == 0] sorted_letters = sorted([letter for letter in letter_frequency.keys() if letter_frequency[letter] > 0], key=lambda x: letter_frequency[x], reverse=True) print("Excluded letters:", excluded_letters) print() f1 = ['a', 'i', 'r'] f2 = ['t', 'o', 'n'] f3 = ['s', 'l', 'c'] f4 = ['u', 'p', 'm', 'd', 'h'] f5 = ['g', 'b', 'y', 'f'] f6 = ['v', 'w','k'] f7 = ['x', 'z', 'q', 'j'] mf = [f6, f5, f4, f3, f2, f1] key = {sorted_letters[0]: 'e'} most_common_letters_m = [sorted_letters[19:22],sorted_letters[15:19] ,sorted_letters[10:15] ,sorted_letters[7:10] ,sorted_letters[4:7], sorted_letters[1:4]] c1 = 0.05 for i1 in range(5): lk1=len(key) key1 = check3(cipher_text, word1, word2, word3, most_common_letters_m, sorted_letters, mf, f7, lk1, key, c1, i1) key.update(key1) del mf[-1] del most_common_letters_m[-1] print(key) print() c1+=0.1 return key def check3(cipher_text, word1, word2, word3, most_common_letters_m, sorted_letters, mf, f7, lk1, key, c1, i1): mp = [[j for j in range(len(mf[i]))] for i in range(len(mf))] row_permutations = [itertools.permutations(row) for row in mp] matrix_permutations = itertools.product(*row_permutations) for permutation in matrix_permutations: for i in range(len(mp)): for j in range(len(mp[i])): key[most_common_letters_m[i][permutation[i][j]]] = mf[i][j] if len(key) < len(sorted_letters): for i, val in enumerate(f7): key[sorted_letters[i]] = val decrypted_text = decrypt(cipher_text, key) k1 = is_plaintext3(decrypted_text, word1, word2 ,word3) #k2 = k1 if k1 > k2 else k2 if( k1 > c1): key1 = dict(list(key)[lk1:len(mp[i1])+lk1]) return key1 def is_plaintext3(text, word1, word2 ,word3): words_found = 0 for word in text.split(): if word.lower() in word1: words_found += 10 if word.lower() in word2: words_found += 3 if word.lower() in word3: words_found += 1 return (words_found / len(text.split())) def decrypt(cipher_text, key): mapping_dict = str.maketrans(key) return cipher_text.translate(mapping_dict)有什么问题
这段代码中存在一些问题,可能会影响其功能:
1. 在 check3 函数中,如果没有找到有效的解密密钥,则没有返回值,因此当函数结束时会返回 None。这可能会导致 guess_key3 函数出现异常或错误,因为它不会检查 check3 的返回值是否为 None。
2. 在 check3 函数中,如果找到了有效的解密密钥,则直接返回了一个部分密钥字典。这意味着在 guess_key3 函数中,如果在第一次调用 check3 之后找到了有效的密钥,则只有部分密钥会被添加到密钥字典中。这可能会导致后续调用 check3 函数时出现问题。
3. 在 check3 函数中,如果找到了有效的解密密钥,则直接返回了该密钥字典的一部分,而不是完整的密钥字典。因此,在 guess_key3 函数中,部分密钥字典将与新的部分密钥字典合并,这可能会导致部分密钥重复,从而导致解密出现问题。
4. 在 check3 函数中,如果找到的有效解密密钥的分数小于当前最佳分数,则不会返回该密钥。这可能会导致 guess_key3 函数返回一个不完整的密钥字典,因为它假设 check3 函数总是返回一个有效的密钥字典。
5. 在 is_plaintext3 函数中,如果文本中有多个单词,它将只计算找到的单词数量的总和,而不是每个单词的分数。这可能会导致分数不准确,从而导致代码选择错误的密钥字典。
需要注意的是,这只是我在快速查看代码时注意到的一些问题,可能还存在其他问题。
阅读全文