这个解决方案可以通过Google Foobar" Re-ID"更有效率?

时间:2017-10-20 16:08:49

标签: python google-foobar

我正在寻找更好的方法来解决Google的Re-ID问题。而不是键入" Re-ID"这里的描述,我将简单列出相关部分:

  1. 有10,000个" Minions"每个都被分配一个0到10000之间的随机整数。
  2. Minion将查找他的整数作为串联素数串的索引 - 即2357111317192329...

  3. 他新的" ID"是通过根据Minion的整数赋值在字符串中查找索引值并将其接下来的4个数字连接起来生成的 - 即如果Minion的整数赋值为3,则他的新ID将是711137是字符串索引3处的值,然后我们添加接下来的4位数/字符)

  4. 解决这个问题我:

    1. 利用(再次感谢,SO)一个函数来识别数字是否为素数:is_prime()
    2. 生成一个连接在一起的所有素数的字符串,这有助于Minion的分配" 10000"加上接下来的4个字符。
    3. 创建一个函数,根据Minion的赋值和连接值字符串生成新ID:answer()
    4. import math
      def is_prime(n):
          if n % 2 == 0 and n > 2: 
              return False
          return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))
      
      primes = ''
      
      for i in range(2,21000,1):
          if len(primes) < 10005:
              if is_prime(i):
                  primes = primes + str(i)
          else:
              break
      
      def answer(n):
          re_id = primes[n:n+5:1]
          return(re_id)
      

      可能改善的领域

      1. my循环中的21000完全是任意的。通过反复试验,我发现21,000便于Minion整数分配10000加上5个附加数字/字符。
      2. 是否有必要事先创建这个长串连接的素数?难道不能根据Minion ID动态完成吗?
      3. 感谢您的见解。快乐星期五。

1 个答案:

答案 0 :(得分:0)

我已使用此代码完成了挑战。

def answer(b):
bag = ""
for num in range(0,20500):
    if num > 1:
        for j in range(2,num):
            if (num % j) == 0:
                break
        else:
            if len(bag) >= 10006:
                break
            else:
                bag += str(num)
return bag[b:b+5]