Ваша задача - реализовать целочисленную последовательность A130826 :
a n - наименьшее положительное целое число, такое, что a n - n - целое число, кратное 3, и двойное число делителей (a n - n) / 3 дает n- й член в первых различиях последовательности, произведенной Flavius Сито Иосифа.
Потерян еще? Ну, это на самом деле довольно легко.
Иосиф Флавий сито определяет целое последовательности следующим образом .
Начните с последовательности натуральных чисел и установите k = 2 .
Удалите каждое k- е целое число последовательности, начиная с k- го .
Увеличьте k и вернитесь к шагу 2.
f n - это n- е целое число (с 1 индексом), которое никогда не удаляется.
Если - как обычно - σ 0 (k) обозначает число положительных делителей целого числа k , мы можем определить a n как наименьшее положительное целое число такое, что 2σ 0 ((a n - n) / 3) = f n + 1 - ф н .
Вызов
Написать программу или функцию , которая принимает целое положительное число п в качестве входных данных и выводит или возвращает в п .
Применяются стандартные правила игры в гольф . Пусть победит самый короткий код!
Отработанные примеры
Если мы удалим каждый второй элемент натуральных чисел, мы останемся с
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 ...
После удаления каждого третьего элемента остатка, мы получаем
1 3 7 9 13 15 19 21 25 27 31 33 37 39 ...
Теперь, удаляя каждый четвертый, затем пятый, затем шестой элемент, мы получаем
1 3 7 13 15 19 25 27 31 37 39 ...
1 3 7 13 19 25 27 31 39 ...
1 3 7 13 19 27 31 39 ...
1 3 7 13 19 27 39 ...
В последнем ряду показаны термины от f 1 до f 7 .
Различия последовательных элементов этих терминов
2 4 6 6 8 12
Разделив эти прямые разницы на 2 , мы получим
1 2 3 3 4 6
Это целевые значения делителей.
- 4 - первое целое число k такое, что σ 0 ((k - 1) / 3) = 1 . В самом деле, сг 0 (1) = 1 .
- 8 - первое целое число k такое, что σ 0 ((k - 2) / 3) = 2 . В самом деле, сг 0 (2) = 2 .
- 15 - первое целое число k такое, что σ 0 ((k - 3) / 3) = 3 . В самом деле, сг 0 (4) = 3 .
- 16 - первое целое число k такое, что σ 0 ((k - 4) / 3) = 3 . В самом деле, сг 0 (4) = 3 .
- 23 - первое целое число k такое, что σ 0 ((k - 5) / 3) = 4 . В самом деле, сг 0 (6) = 4 .
- 42 - первое целое число k такое, что σ 0 ((k - 6) / 3) = 6 . В самом деле, сг 0 (12) = 6 .
Контрольные примеры
n a(n)
1 4
2 8
3 15
4 16
5 23
6 42
7 55
8 200
9 81
10 46
11 119
12 192
13 205
14 196622
15 12303
16 88
17 449
18 558
19 127
20 1748
21 786453
22 58
23 2183
24 3096
25 1105
26 786458
27 12582939
28 568
29 2189
30 2730
источник
Ответы:
Желе,
30292725 байтСохранено 2 байта благодаря уведомлению @Dennis
Æd
и еще 2 байта для объединения двух цепочек.Попробуйте онлайн!
Это было, наверное, самое веселое, что я когда-либо имел с Желе Я начал со второй строки, которая вычисляет f n из n по формуле OEIS, и это довольно красиво.
объяснение
источник
Python 2 ,
121119118 байтВремя выполнения должно быть примерно O (16 n ) с использованием O (4 n ) памяти. Замена
4**n
на5<<n
- что я считаю достаточным - значительно улучшила бы это, но я не уверен, что он работает для сколь угодно больших значений n .Попробуйте онлайн!
Асимптотическое поведение и верхние оценки n
Определите b n как (a n - n) / 3 , т. Е. Наименьшее положительное целое число k такое, что σ 0 (k) = ½ (f n + 1 - f n ) .
Как отмечено на странице OEIS, f n ~ ¼πn 2 , поэтому f n + 1 - f n ~ ¼π (n + 1) 2 - ¼πn 2 = ¼π (2n + 1) ~ ½πn .
Таким образом, ½ (f n + 1 - f n ) ~ ¼πn . Если фактическим числом является простое число p , наименьшее положительное целое число с делителями p равно 2 p-1 , поэтому b n можно аппроксимировать как 2 c n , где c n ~ ¼πn .
Поэтому b n <4 n будет выполняться для достаточно больших n , и учитывая, что 2 ¼πn <2 n << (2 n ) 2 = 4 n , я уверен, что нет контрпримеров.
Как это работает
Это устанавливает несколько ссылок для нашего итеративного процесса.
n - пользовательский ввод: положительное целое число.
r - список [1, ..., 4 n - 1] .
s является копией r .
Повторение списка один раз с
r*1
созданием мелкой копии, поэтому изменение s не изменит r .d инициализируется как кортеж (ы) .
Это первое значение не важно. Все остальные будут иметь число делителей положительных чисел.
Для каждого целого числа k от 1 до 4 n - 1 мы делаем следующее.
del s[k::k+1]
берет каждое (k + 1) -ое целое число в s - начиная с (k + 1) -ого - и удаляет этот фрагмент из s .Это простой способ хранения начального интервала сита Флавиуса Иосифа в с . Он будет вычислять намного больше, чем требуется n + 1 начальных членов, но использование одного
for
цикла для обновления как s, так и d экономит некоторые байты.d+=sum(k%j<1for j in r)*2,
подсчитывает, сколько элементов r делит k равномерно и добавляет 2σ 0 (k) к d .Поскольку d был инициализирован как одноэлементный кортеж, 2σ 0 (k) сохраняется в индексе k .
Это находит первый индекс f n + 1 - f n в d , который является наименьшим k таким, что 2σ 0 (k) = f n + 1 - f n , затем вычисляет a n как 3k + 1 и печатает результат.
источник
Java 8,
336,305,303,287,283279 байт57 байт удалено благодаря Kritixi Lithos
Golfed
Ungolfed
источник
int
короче, чем использованиеjava.util.Scanner
. Но даже если вы используете сканер, вы можетеSystem.out.print(h(new java.util.Scanner().nextInt()))
удалить и удалить предыдущую строкуint h()
вы можете изменить его наint v = (g(k,k)-g(k,k-1))/2,u = 0,t = 1;
. Вы можете изменить свой оператор if (который находится внутри вашего цикла for) сif(t%i==0)
наif(t%i<1)
g
чтобы она возвращала с помощью троичных операторов что-то вродеreturn s==0?N+1:g(s-1,N+N/2)
-ishMathematica,
130116106103 байтили
Закончилось почти идентично коду Jelly @ Pietu1998 ...
объяснение
Catch
что бы то ни былоThrow
(брошено).Бесконечный цикл;
k
начинается с1
и увеличивает каждую итерацию.Назначить
f
:Найти
{1, 2, ... , n}
. Переверните это.Функция, которая выводит ceil (n1 / n2 + 1) * n2
Назначьте
f
функцию, которая рекурсивно применяет вышеуказанную функцию к списку из двух вышеперечисленных шагов, используя каждый выход в качестве первого ввода и каждый элемент списка в качестве второго ввода. Начальный «вывод» (первый ввод) является первым элементом списка.Проверьте,
k
равно ли число делителей в два раза f (n + 1) - f (n).Если условие является
True
,Throw
значениеk
. Если нет, продолжайте цикл.Умножьте вывод на 3 и добавьте n.
130-байтовая версия
источник
Perl , 6 ,
154149136107 байтUngolfed:
источник
05AB1E ,
353439 байтЭто выглядит ужасно, так же как и производительность во время выполнения. Требуется несколько секунд для ввода, который дает небольшие значения. Не пытайтесь числа как 14; в конечном итоге он найдет результат, но это займет много лет.
объяснение
Работает как 2 последовательно называемые программы. Первый вычисляет F п + 1 - Р п , а второй определяет , а п , основанный на определении его, используя BruteForce подход.
F n + 1 - F n оценивается для каждой итерации, даже если она инвариантна для цикла. Это делает время кода неэффективным, но делает код короче.
Попробуйте онлайн!
источник
žHL
), а затем отфильтровывает значения, которые не удовлетворяют ограничениям на сито. Я думаю, что первая часть этой программы должна быть полностью переписана с совершенно другим подходом, чтобы сделать ее пригодной для игры в гольф.given enough time and memory
, поскольку я уже видел несколько ответов на другие вопросы, которые шли так медленно, что было почти невозможно сказать, дали ли они правильный результат или нет. По этой причине я отложил вычисление сита за пределы цикла, и это стоило мне 2 байта.