【发布时间】:2023-02-15 23:28:37
【问题描述】:
我面临的问题是我的解码器功能。据我所知,我正确地编码了这个值;但是,它不会解码回给定的字符串。我提供了一个在 encoder() 块中使用的编码过程和方程的示例。
从我提供的代码中你会看到,我尝试使用val % 4,得到余数,然后减去1得到索引;但是,返回的字符串与我编码的字符串不同。
这是我的程序的当前状态:
import numpy as np
alphabet = {
'a': 1,
'b': 2,
'c': 3,
'd': 4
}
def encoder(val):
"""
Params:
val(string): string that we are going to encode must be length 5 or less
Alphabet and corresponding values:
alphabet: {a b c d}
values: {1 2 3 4} -> for encoding
Returns:
econded_value(int)
"""
# example: babca
# encoded: (2 x (4^4)) + (1 x (4^3)) + (2 x (4^2)) + (3 x (4^1)) + (1 x (4^0))
encoded_val = 0
power = len(val) - 1 # keeps track of what value we need to put 4 to the power of
# to encode we need to loop over the string
for i in range(len(val)):
encoded_val += ((4**power) * alphabet[val[i]])
power -= 1
return encoded_val
def decoder(val):
r_string = ""
# convert dictionary to two lists so we can access the keys (letters) using the values (numbers) thus making the decoded string
letter_list = list(alphabet.keys())
number_list = list(alphabet.values())
print(letter_list, number_list)
while val > 0:
r_string += letter_list[number_list[(val%4)-1]]
val = val // 4
return r_string
if __name__ == '__main__':
val = encoder("babca")
print(decoder(val))
【问题讨论】:
-
val%4将产生 0、1、2 或 3 的值;从中减去 1 会将范围变为 -1、0、1 或 2。这真的是您想要的吗?添加1 似乎更有可能在这里工作。 -
@jasonharper
(val%4)-1用作字母表值的索引。例如。0映射到1,后者映射到'a'。有点令人费解,但这不是错误。 -
将 1 到 4 作为字母表的值,然后使用 %4 进行解码,将会出现问题。想想十进制数。我们可以连续执行 n%10 来获取单个数字,但我们的数字是 0 到 9,而不是 1 到 10。
-
我看到的最大问题是代码的长度。由于您使用 1-4 编码 4 个字母,4 是
0b100和4^n对于n的每个增量仅移动 2,一旦您想写 d,您将开始覆盖以前编写的代码字母。