Python 2.7 foobar挑战卡在素数位置上

Python 2.7 foobar挑战卡在素数位置上,python-2.7,list-comprehension,Python 2.7,List Comprehension,我现在被困在这里了,作业结束了 给定N,求N+4个字符在素数字符串中的位置。 例如,一个素数字符串是23571113 所以: n=3 数字为71113 n=0 数字为23571 n不能大于10000 这是我的代码,我绞尽脑汁想如何提高效率,但当我尝试做一个10000个测试用例时,它花费的时间太长,这就是为什么我认为我在10个测试用例中有4个失败了: def answer(n): # your code here n = int(n) ID_len = 0 inpu

我现在被困在这里了,作业结束了 给定N,求N+4个字符在素数字符串中的位置。 例如,一个素数字符串是23571113

所以:
n=3 数字为71113

n=0 数字为23571

n不能大于10000

这是我的代码,我绞尽脑汁想如何提高效率,但当我尝试做一个10000个测试用例时,它花费的时间太长,这就是为什么我认为我在10个测试用例中有4个失败了:

def answer(n):
    # your code here
    n = int(n)
    ID_len = 0
    input_limit = 10000  # adjustable limit for n
    y = 0 # Counter
    if n<= input_limit: #checks to make sure you're under the limit of 10000 for n
        try:
            while (ID_len < (n+5)):
                    y += 2
                    primes = [x for x in range(2, y + 1) if all(x%i for i in range(2,x))]
                    prime_str = ''.join(map(str,primes))
                    ID_len = len(prime_str)
            #print prime_str
            return  prime_str[n:n+5]
        except:
            pass
    else:
        print ("pick a number smaller than {0}".format(input_limit))
def应答(n):
#你的代码在这里
n=int(n)
ID_len=0
输入限制=10000#n的可调限制
y=0#计数器

如果nOoh伙计,我想我注意到了每个循环都试图重做已经完成的范围的问题。我需要保留字符串中最后一个素数的计数器,并从那里开始

Ooh伙计,我想我注意到了每个循环都试图重做已经完成的范围的问题。我需要保留字符串中最后一个素数的计数器,并从那里开始

有点晚了。。。正如您所注意到的,您不必在每次迭代中计算
primes
:只需将其移出循环,并在列表中用适当的值替换
y
。但为什么要保留计算?如果你不受房间的限制,你可以写:

prime_str = "23579..." # 10000 chars here
让我们假设这是不被接受的。您的代码至少有两个基本改进:

  • 您不需要构建完整的
    prime_str
  • 您可以加快
    素数的生成
    
第一个改进:

N = n+5
s = " "*10 # a slice large enough
for prime in primes(): # a generator of primes (see below)
    prime_str = str(prime)
    N -= len(prime_str)
    # add the prime at the end of the slice, 
    # remove chars at the beginning to keep the size
    s = s[len(prime_str):] + prime_str        
    if N<0:
        return s[N-5:N] # return the correctp part of the slice.

有点晚了。。。正如您所注意到的,您不必在每次迭代中计算
primes
:只需将其移出循环,并在列表中用适当的值替换
y
。但为什么要保留计算?如果你不受房间的限制,你可以写:

prime_str = "23579..." # 10000 chars here
让我们假设这是不被接受的。您的代码至少有两个基本改进:

  • 您不需要构建完整的
    prime_str
  • 您可以加快
    素数的生成
    
第一个改进:

N = n+5
s = " "*10 # a slice large enough
for prime in primes(): # a generator of primes (see below)
    prime_str = str(prime)
    N -= len(prime_str)
    # add the prime at the end of the slice, 
    # remove chars at the beginning to keep the size
    s = s[len(prime_str):] + prime_str        
    if N<0:
        return s[N-5:N] # return the correctp part of the slice.