Задний план
Рассмотрим последовательность, определенную следующим образом:
- Первый элемент 0;
- Второй элемент 4;
- Начиная с третьего элемента, его значение можно рассчитать по формуле:
- Взятие набора целых чисел от 0 до предыдущего элемента последовательности (включительно или исключительно, это не имеет значения);
- Удаление любых целых чисел, которые уже появились ранее в последовательности из набора;
- Складывая оставшиеся элементы набора; это значение, которое вы хотите.
Интересно, что эта последовательность еще не появилась в OEIS .
Задание
Напишите программу или функцию, которая принимает целое число n в качестве входных данных и выводит n- й элемент последовательности.
Контрольные примеры
Первые несколько элементов последовательности:
- 0
- 4
- 6 (1 + 2 + 3)
- 11 (1 + 2 + 3 + 5)
- 45 (1 + 2 + 3 + 5 + 7 + 8 + 9 + 10)
- 969 (1 + 2 + 3 + 5 + 7… 10 + 12… 44)
- 468930 (1 + 2 + 3 + 5 + 7… 10 + 12… 44 + 46… 968)
Разъяснения
- Ваша программа теоретически должна быть способна обрабатывать произвольное число n, если она запускается на варианте вашего языка, который имеет неограниченно большие целые числа и имеет доступ к неограниченному объему памяти. (Маловероятно, что языки без бинумов смогут выйти за рамки 468930, но это не повод жестко закодировать ответы.)
- Вы можете выбрать индексирование на основе 0 или 1 для последовательности (например, вам решать, вернет ли n = 1 первый элемент, n = 2 второй элемент и т. Д., Или n = 0 вернет первый элемент , п = 1 , второй элемент, и так далее).
- Нет требований ни к используемому алгоритму, ни к его эффективности; вы можете напрямую реализовать определение последовательности (даже если она действительно неэффективна), и вы можете также реализовать другой алгоритм, который приводит к тем же результатам.
Состояние победы
Это код-гольф , поэтому выигрывает самая короткая правильная программа, измеряемая в байтах.
Ответы:
Желе ,
13129 байтИспользует индексирование на основе 0.
Попробуйте онлайн!
Как это работает
источник
Python,
6660 байтСпасибо @Dennis за то, что сбрил 6 байтов!
Это не самый лучший кусок кода за всю историю, но он использует формулу, которую я сделал:
Где
x
на правой стороне естьf(n - 1)
, иy
естьf(n - 2)
.Объяснение:
Сумма непрерывных целых чисел от
a
доb
(включительно) может быть описана этой формулой:Где
amount
(количество чисел) описывается так:И
average
(среднее из всех чисел) описывается так:Итак, полная формула теперь:
Образом мы реализуем эту формулу в окончательную формулу заменить
a
наf(n - 1)
,b
наf(n - 2)
, который в основном вычисляет сумму всех новых терминов, и добавить еще одинf(n - 1)
(который в настоящее времяa
) на, что сумма всех предыдущих членов.Объединяя это вместе, мы получаем:
Замените
a
наx
иb
сy
, и эй Presto, вы должны формула выше.источник
Python 2 ,
585450 байтПопробуйте онлайн!
источник
Mathematica,
4948 байтовИспользует кодировку CP-1252. Определяет функцию
PlusMinus (±)
. 1-индексироваться.объяснение
источник
Оазис , 11 байт
Код:
Объяснение:
Чтобы визуализировать отношение f n , давайте возьмем пример f 5 . Чтобы вычислить f 5 , давайте посмотрим на следующую сумму:
1 + 2 + 3 + 5 + 7 + 8 + 9 + 10
Жирная часть точно такая же, как f 4 . Часть 7 + 8 + 9 + 10 - это диапазон [f n-2 + 1, f n-1 - 1] . Это дает формулу f n-1 + Σ [f n-2 + 1 ... f n-1 - 1] ( ссылка Вольфрама ):
f n = 0,5 × (f n-1 2 - f n-2 2 + f n-1 - f n-2 )
Который может быть переписан на:
f n = 0,5 × ((f n-1 - f n-2 ) (f n-1 + f n-2 ) + (f n-1 - f n-2 ))
f n = 0,5 × ((f n-1 - f n-2 ) (f n-1 + f n-2 + 1))
Какую формулу мы будем использовать в коде:
Объяснение кода
640
Часть дает нам базовые случаи:Код, который будет выполнен (который определяет (n) ):
Попробуйте онлайн!
источник
Юлия,
393332 байта0 на основе.
Благодаря @Dennis сэкономлено 6 байт.
Благодаря @GlenO, сохранил байт.
Попробуйте онлайн!
Предыдущий ответ 1- на основе:
Попробуйте онлайн!
Предыдущий негольфированный ответ на основе 1:
Попробуйте онлайн!
источник
n<3?5n-n^2:
вместоn<4?2(n>1)n:
- обратите внимание, что он переключается на индексирование с нуля.JavaScript (ES6), 47 байт
Использует рекуррентное соотношение, которое
f(n) = sum(range(f(n-2) + 1, f(n-1) + 1))
при n> 2.источник
PowerShell ,
84898887 байтПопробуйте онлайн!
объяснение
Индексирование на основе 0. Работает только через
n = 6
(на моей Windows-машине происходит сбой при переполнении стекаn = 7
)Используя тот же метод, что и ответ JungHwan Min (сумма диапазона минус сумма предыдущих терминов).
Суммирование диапазона / массива в PowerShell занимает много времени, поэтому я использую хитрость, заключающуюся в соединении массива с помощью
+
создания длинного выражения (например1+2+3+4...etc
) и последующей его отправки черезiex
(Invoke-Expression
).Поскольку мне нужно сделать это дважды, вместо использования
-join
я устанавливаю специальную переменную$OFS
, которая обозначает разделитель выходного поля. Когда вы структурируете массив, это символ, используемый для объединения элементов; по умолчанию это пробел. Таким образом , установив его+
(один раз), я могу заменить что - то подобное$a-join'+'|iex
с"$a"|iex
.Простой
for
цикл продолжается до тех пор, пока счетчик последовательности не станет меньше или равен входному целому числу, тогда я верну$n
th-й элемент.источник
;
необходимости послеfor
цикла. Никогда не осознавал этого раньше.MATL ,
1716 байт1
на основе индексации используется. Код очень неэффективен. Ибоn = 6
он уже превышает лимит памяти онлайн-компилятора.Попробуйте онлайн!
Как это работает
Для 20 байт следующая версия позволяет избежать ограничения памяти. Но все же есть ограничение
double
типа данных ( тип может гарантировать только то, что целые числа точно представлены до2^53
), поэтому результаты действительныn = 8
только до .Попробуйте тоже онлайн !
источник
Haskell , 42 байта
Попробуйте онлайн!
Это непосредственно реализует рецидивы что
n>2
,f(n)
равноf(n-1)
плюс сумму открытого интервала отf(n-2)
кf(n-1)
которой вновь равна сумме полусегмент отf(n-2)
доf(n-1)
включительно.источник
Haskell, 31 байт
Пример использования:
((0:4#6)!!) 6
->468930
. Попробуйте онлайн! ,Простая рекурсия, которая отслеживает максимальный элемент
m
до следующего значенияs
.источник
JavaScript,
123119 байтПопробуйте онлайн! Это решение основано на 1
f(1) => 0
.источник
Perl 6 ,
52 49 4435 байтПопытайся
Попытайся
Попытайся
Попытайся
Expanded:
источник
PowerShell ,
7773 байтаПопробуйте онлайн!
Реализует алгоритм, как определено, и 0-проиндексирован. Ввод
6
слишком много для TIO для обработки.Устанавливает
$a
быть массивом[0,4]
. Циклы от1
до ввода$n
. В цикле мы берем диапазон чисел от0
наибольшего числа, которое у нас есть$a[-1]
, и используемWhere-Object
предложение,|?{...}
чтобы извлечь только те числа, которых еще нет. Этот массив чисел-join
редактируется вместе с+
s, а затем подается наiex
(сокращение отInvoke-Expression
и аналогичноeval
). Это значение затем присоединяется к массиву в конце$a
. Наконец, мы выходим из нашего цикла и берем число$n
th в нашем массиве. Это число остается в конвейере, а вывод неявным.источник
Python 2 , 85 байт
Попробуйте онлайн!
источник
Пакетная, 108 байтов
Порт моего JavaScript ответа.
источник
постоянный ток , 47 байтов
Работает с целыми числами, как вы хотите, вплоть до объема памяти компьютера.
Попробуйте онлайн!
Индексирование на основе 0, ввод в stdin, вывод в stdout. (Также есть вывод на stderr, который следует игнорировать.)
Образцы прогонов:
В нем используется тот же алгоритм, что и в следующем решении в bash, которое (немного) более читабельно:
Чистый bash, 60 байтов
Но программа bash работает только для входов до 7, поскольку она выходит за пределы целочисленного переполнения.
источник
Pyth - 15 байт
Тестовый пакет .
источник
C # - 74 байта
Ungolfed:
Вероятно, есть способ преобразовать это в лямбду, чтобы сэкономить еще больше, или что-то еще, используя функцию .Aggregate. Хотя в настоящее время у меня нет импорта, так что, может быть, это выровняется?
источник
> <> , 43 + 3 = 46 байт
Использует формулу, представленную в ответах Аднана и Кверпа-Дерпа .
Ожидается, что входные данные будут присутствовать в стеке, поэтому +3 байта для
-v
флага.Попробуйте онлайн!
источник