背景
这个问题的灵感来自凯撒密码。给定修改后的ASCII值i
其中i > 122 or i < 97
,目标是找到以其值表示的字符。例如,由于'z'
值为122
,然后123
参考'a'
以及149
和97 +- 26n
。
目标
函数calc_chr
应计算移动的ASCII值,同时停留在abc
的范围内,即[97, 122]
十进制。
清晰的示例
令'x'
为120
令new_val
为'x' + 5
-->125
calc_chr(new_val)
等于'c'
函数返回'c'
,由于'x'
转移5次:x -> y, z, a, b, c
。
解决方案
解决方案不是有效的。
while new_val > 122:
new_val -= 26
while new_val < 97:
new_val += 26
如果存在,所需的解决方案是计算(不是循环)。
尚不清楚您实际想做什么。我的理解是您要输入人造数字,然后将其转换为97到122(两者都包含在间隔中)。
最简单的方法是:
number = input('Your number: ')
mod_number = ((number - 97) % 26) + 97
print(number, chr(number))
这样,您输入一个数字,如果包含在97到122之间,则将保留。否则,它将移至该间隔。因此,如果您输入123,最终将获得97,如果您交出96,最终将获得122。
您想要以下ASCII映射:
a-z
0-18, 19-44, 45-70, 71-96, 97-122, 123-148, 149-174, 175-200, 201-226, 227-252, 253-255
h-z a-z a-z a-z a-z a-z a-z a-z a-z a-z a-c
--------- 1 -------------------/
---------------------------- 2 ---------------------------/
对于大多数编程语言(其余的符号是股息的标志),可以使用两种不同的公式:
对于范围0到122中的所有数字使用:
r = 122 - ((122 - n) % 26)
对于97至255范围内的所有数字使用:
r = ((n - 97) % 26) + 97
但是,因为如果我们将分隔线的倍数添加到股息中,则其余部分不会改变,所以我们可以增加4次26,避免完全处理负面股息。
r = ((n - 97) % 26) + 97
=> r = ((n - 97 + (4 * 26)) % 26) + 97
<=> r = ((n - 97 + 104) % 26) + 97
<=> r = ((n + 7) % 26) + 97 ; This will work no matter how '%' functions
现在在Python中,由于%
运算符的功能,我们可以使用此一种配方:
r = ((n - 97) % 26) + 97
a 非常快速替代方案定义了256个字节数组,然后使用计算的数字作为此数组中的偏移,立即获取结果。
下面是汇编(MASM)中可能的样子:
; On input AL register is number n=[0,255]
mov bx, offset array
xlatb
; On output AL register is number r=[97,122] ; ["a","z"]
...
array db 'hijklmnopqrstuvwxyz'
db 9 dup ('abcdefghijklmnopqrstuvwxyz')
db 'abc'
,在python中它变成
s[n]
n 范围从0到255,并使用256字节字符串 s
s = ("hijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyz"
"abc"
)