Предположим, мы начинаем с бесконечного списка простых чисел:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, ...
Затем мы берем абсолютные различия между каждой парой чисел, многократно:
[1, 2, 2, 4, 2, 4, 2, 4, 6, 2, 6, 4, 2, 4, 6, 6, 2, 6, 4, ...
[1, 0, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 2, 2, 0, 4, 4, 2, ...
[1, 2, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 4, 0, 2, ...
[1, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 4, 2, ...
Обратите внимание, что ведущий номер равен 1 каждый раз. Гипотеза Гилбрита - это предсказание, что так будет всегда.
Единственный способ, чтобы старшее число перестало быть 1, это если следующий номер после него не был ни 0, ни 2. Единственный способ, которым второе число не было бы 0 или 2, это если бы число после этого не было ни 0 ни 2. И так далее.
Индекс самого раннего числа, кроме первого 1, который не является ни 0, ни 2, никогда не может уменьшиться более чем на 1 между последовательной парой последовательностей. Этот факт использовался, чтобы поставить очень сильную нижнюю границу, когда, если вообще, последовательность может не иметь 1 в качестве первого элемента.
В этом задании вам дадут индекс последовательности, и вы должны вывести индекс первого числа в этой последовательности, которое не является ведущим 1 и не является 0 или 2.
Например, в 4-й последовательности абсолютных разностей выше:
[1, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 4, 2, ...
Первая запись, которая не является ни нулем, ни двумя, кроме первой записи, является 15-й позицией, 14 индексированными нулями. Так что, если на входе было 4, вы бы вывели 14.
Для входов от 1 до 30 выходы должны быть:
[3, 8, 14, 14, 25, 24, 23, 22, 25, 59, 98, 97, 98, 97, 174, 176, 176, 176, 176, 291, 290, 289, 740, 874, 873, 872, 873, 872, 871, 870]
Это OEIS A000232 .
Предполагается, что у вас есть 1 проиндексированный вход и 0 проиндексированных выходов. Вы можете индексировать свои входы и выходы, начиная с любых постоянных целых чисел, при условии, что вы можете принять диапазон входных данных, соответствующий всем последовательностям.
Требования: Ваше решение должно работать не более 1 минуты при входе до 30. Если оно достаточно близко, чтобы зависеть от характеристик компьютера, оно разрешено.
Самый короткий код выигрывает.
источник
Ответы:
Желе , 17 байт
Попробуйте онлайн!
Ввод 2-индексация. Выход 1-индексация.
На TIO все тесты в общей сложности занимают 22,309 с.
источник
Mathematica, 66 байт
Чистая функция, принимающая положительное целое число в качестве аргумента и возвращающая целое число с 1 индексом.
Nest[Abs@*Differences,Array[Prime,z+#],#]
вычисляет#
повторный список абсолютных разностей списка первыхz+#
простых чисел.For[z=1,Last@...<3,z++]
Зацикливает это вычисление до тех пор, пока не будет хотя бы последний элемент результирующего списка3
, а затемz
выводится. (Обратите внимание, что правильность алгоритма предполагает гипотезу Гилбрита!)источник
Pyth , 32 байта
Попробуйте онлайн!
Использует 2-индексацию.
источник
MATL , 18 байт
Вход и выход основаны на 1. Для каждого из тестовых случаев в TIO требуется менее 40 секунд.
Попробуйте онлайн!
объяснение
Это продолжает пробовать более длинные начальные последовательности простых чисел, пока повторяющиеся абсолютные последовательные различия не дадут хотя бы одно превышение значения
2
.источник
Perl 6 ,
136120 байтUngolfed:
При вводе 30 функция запускается примерно за четыре секунды на моем скромном ноутбуке.
... который становится равным 1,4 секундам после обновления моей семимесячной установки Perl 6 (что также дает мне
skip
метод, который позволяет мне сбрить несколько байтов из моего первого решения). Все тестовые случаи от 1 до 30 занимают около десяти секунд.источник
Haskell , 94 байта
Попробуйте онлайн! Последняя строка является анонимной функцией. Привязать к например
g
и позвонить, какg 4
. Все тестовые случаи в совокупности занимают менее 2 секунд на TIO.Как это устроено
[n|n<-[2..],all((>0).mod n)[2..n-1]]
генерирует бесконечный список простых чисел.f(a:b:r)=abs(a-b):f(b:r)
является функцией, дающей абсолютные различия элементов бесконечного списка. Учитывая числоn
,(iterate f[n|n<-[2..],all((>0).mod n)[2..n-1]]!!)
применяетсяf
n
раз к списку простых чисел.length.fst.span(<3)
вычисляет длину префикса результирующего списка, где элементы меньше 3.источник
Аксиома, 289 байт
раскрутить и проверить
Если решение не найдено, разверните список простых чисел 2 * x в цикле и пересчитайте все оставшиеся списки. 3 секунды для поиска г (30)
источник