找到字符的最接近素数的ASCII值--- Python

时间:2017-07-28 20:11:19

标签: python ascii

我从用户那里得到一个字符串输入,将其分解为一个字符列表,将每个字符转换为其ASCII值,然后搜索最接近的Prime数字。将(素数)ASCII值转换回字符列表,将它们连接在一起并在屏幕上打印。听起来很简单,但我觉得找到最接近的素数很棘手。

def is_prime(num):
    if num > 1:
        for n in range(2, num):
            if (num % n) == 0:
                return False
        else:
            return True
    else:
        return False


test_cases = int(input())


for _ in range(test_cases):
    string = str(input())
    array = list(string)
    result_array = []

    for i in array:
        if is_prime(ord(i)):
            result_array.append(i)
        else:
            pass

    print("".join(result_array))

在最后一行"传递"声明只是有一个无错误的代码,直到我找到解决方案。这是搜索继续进行的部分。

1 个答案:

答案 0 :(得分:3)

你的算法无法工作,因为它永远不会解决“最接近素数”问题(注意检查这样的素数效率不高:最大边界可以是n**0.5+1

那就是说,小写字母存在这个问题的缺陷:

素数从113跳到127.对于高小写字母,最接近的素数是127,这是不可打印的。

所以我会坚持使用大写字母(除非我们想要打印最接近的最低素数,在这种情况下小写是正常的)

我要做的是:

  • 生成/复制素数列表从0到97(Z的ASCII为96)
  • 在字符上循环,并使用bisect模块在​​主要列表中找到字符ASCII代码的插入位置(必须排序才能bisect工作正确)。
  • 然后检查上限是否比下限更近,并选择主要列表的索引。
  • 小提琴(很多)带有插入索引以避免错误(比如我的帖子的第一个版本)
  • 添加到列表中。最后join

代码:

import bisect

# list sampled from https://primes.utm.edu/lists/small/1000.txt
# ASCII code for 'A' is 65, no need to go lower
primes = [int(x) for x in """61 67     71     73     79     83     89     97""".split()]

word = "ABCDEFGHIJKLMNOPRSTUVWXYZ"

primeword = []
for w in word:
    ow = ord(w)
    i = bisect.bisect_left(primes,ow)
    delta1 = abs(ow-primes[i])
    delta2 = abs(ow-primes[i-1])
    # select this index or next index (no risk for out of range here)
    primeword.append(chr(primes[i + int(delta2 > delta1) - 1]))

print("".join(primeword))

给了我:

CCCCCGGGIIIIOOOOSSSSSYYYY

编辑:既然我们生成了素数,我们也可以直接生成字符的查找表并使用str.translate

primeword_dict = {65: 'C', 66: 'C', 67: 'C', 68: 'C', 69: 'C', 70: 'G', 71: 'G', 72: 'G', 73: 'I', 74: 'I', 75: 'I', 76: 'I', 77: 'O', 78: 'O', 79: 'O', 80: 'O', 82: 'S', 83: 'S', 84: 'S', 85: 'S', 86: 'S', 87: 'Y', 88: 'Y', 89: 'Y', 90: 'Y'}
print(word.translate(primeword_dict))

会更快&更短,并允许传递像"HELLO WORLD.这样的字符串(其中包含空格和标点符号),并且只更改字母和字母。其他符号保持不变。