将移动的ASCII值转换为ABC范围内的字符



背景

这个问题的灵感来自凯撒密码。给定修改后的ASCII值i其中i > 122 or i < 97,目标是找到以其值表示的字符。例如,由于'z'值为122,然后123参考'a'以及14997 +- 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 ---------------------------/

对于大多数编程语言(其余的符号是股息的标志),可以使用两种不同的公式:

  1. 对于范围0到122中的所有数字使用:

     r = 122 - ((122 - n) % 26)
    
  2. 对于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"
    )

相关内容

  • 没有找到相关文章

最新更新