Может ли это решение для Google Foobar "Re-ID" быть более эффективным?

Я ищу руководство по лучшему способу решения проблемы Google Re-ID. Вместо того, чтобы вводить здесь описание "Re-ID", я просто перечислю соответствующие части:

  1. Есть 10000 "миньонов", каждому из которых присваивается целое число случайным образом от 0 до 10000 включительно.
  2. Миньон будет искать свое целое число как индекс в строке простых чисел - т.е. 2357111317192329...

  3. Его новый "ID" генерируется путем нахождения значения индекса в строке в соответствии с целочисленным присваиванием Миньона и конкатенации следующих четырех чисел с ним - т.е. если целочисленное присваивание Миньона 3 его новый идентификатор будет 71113 (7 значение в индексе 3 строки, затем мы добавляем следующие 4 цифры / символа)

Чтобы решить это я:

  1. Использовал (спасибо еще раз, SO) функцию, чтобы определить, является ли число простым или нет: is_prime()
  2. Генерирует строку всех простых чисел, соединенных вместе, что облегчает Миньон с присваиванием "10000" плюс следующие 4 символа.
  3. Создана функция для генерации нового идентификатора на основе назначения Миньона и строки объединенных значений: answer()
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. 21000 по моему цикл for совершенно произвольный. Методом проб и ошибок я обнаружил, что 21000 облегчает целочисленное назначение Minion 10000 плюс 5 дополнительных цифр / символов.
  2. Нужно ли создавать эту длинную строку простых чисел заранее? Разве это не может быть сделано динамически на основе идентификатора миньона?

Спасибо за ваши идеи. Счастливая пятница

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]
Другие вопросы по тегам