Вот последовательность, о которой я говорю:
{1, 4, 5, 9, 10, 11, 16, 17, 18, 19, 25, 26, 27...}
Начиная с 1, оставьте 1, отбросьте следующие 2, оставьте следующие 2, сбросьте 3, оставьте 3 и так далее. Да, это тоже на OEIS (A064801) !
Соревнование
Дано целое число n>0
, найти n-й член вышеуказанной последовательности
Тестовые случаи
Input -> Output
1->1
22->49
333->683
4444->8908
12345->24747
Это код гольф, поэтому выигрывает самый короткий ответ в байтах! Удачи!
Ответы:
Java (OpenJDK 8) ,
4544 байтаПопробуйте онлайн!
-1 байт благодаря @Nevay
Посмотрев на это некоторое время, я заметил закономерность. Каждый раз, когда мы сбрасываем
n
числа, следующее число в последовательности является идеальным квадратом. Видя это, я мысленно разбил последовательность на удобные фрагменты: в[[1],[4,5],[9,10,11],...]
основном,i
th-й блок начинается сi*i
итераций вверх дляi
элементов.Чтобы найти число
n
th в этой последовательности, мы хотим сначала найти, в каком блоке находится номер, а затем какую позицию в блоке он занимает. Мы вычитаем наше приращение числаi
отn
доn
не меньше , чемi
(что дает нам кусок), а затем просто добавитьn-1
к ,i*i
чтобы получить правильныеposition
в блоке.Пример:
источник
return~-n+i*i;
чтобы сохранить 1 байт.Haskell,
484341 байт4 дополнительных байта для индексации на основе 1 вместо 0 на основе. Ненужное ограничение, ИМХО.
Попробуйте онлайн!
источник
Python 3 ,
4746 байт1 байт благодаря мистеру Xcoder.
Попробуйте онлайн!
ОЧЕНЬ быстро для больших номеров
источник
def f(n):a=round((2*n)**.5);return~-n+a*-~a//2
. Хотя не уверен ... Умный подход!a*(a+1)
даже для каждого целого числа. Жалуется ли Python на деление с плавающей точкой на целые числа? Он жалуется на побитовые операции над числами? Если нет(2*n)**.5+.5|0
.Желе , 8 байт
Попробуйте онлайн!
источник
Haskell , 33 байта
Анонимная функция. Использовать как
((!!)$0:do n<-[1..];[n^2..n^2+n-1]) 1
Попробуйте онлайн!
!!
. Элемент-0:
фиктивный элемент для настройки индексации от 0 до 1.[n^2..n^2+n-1]
строит подпоследовательность без пробелов, начиная с квадратаn
и содержащегоn
числа.do
Обозначения сцепляют построенные диапазоны для всехn>=1
.источник
Python 3 , 46 байт
Попробуйте онлайн!
источник
Perl 6 , 43 байта
Проверь это
Expanded:
(1..*).rotor({++$=>++$+1}...*)
производит:источник
TeX, 166 байт
использование
источник
Javascript,
4338 байтПопробуйте онлайн!
Я использую тот факт, что для каждого треугольного числа плюс один, результатом является квадратное число.
Как пример: треугольные числа 0, 1, 3, 6, 10 ... поэтому для 1, 2, 4, 7, 11 ... мы наблюдаем 1, 4, 9, 16, 25 ... в нашей последовательности ,
Если индекс находится где-то между этими известными числами, элементы нашей последовательности перемещаются только на единицу. Например, чтобы вычислить результат для 10, мы берем 7 (как треугольное число плюс один), берем результат (16) и добавляем 10-7 = 3. Таким образом, 16 + 3 = 19.
источник
05AB1E , 12 байтов
Попробуйте онлайн!
источник
[0..a-1] + a**2
, здорово , что здесь имо это толькоÝÁćn+
вместоD<Ýsn+
.cQuents , 27 байтов
Попробуйте онлайн!
В настоящее время это порт ответа Python от Leaky , но я думаю, что есть лучший способ.
источник
Swift 3 , 72 байта
Порт моего решения Python .
Тестирование.
источник
C # (моно) , 164 байта
Попробуйте онлайн!
источник
Mathematica, 37 байт
объяснение
Function
который принимает положительное целое число#
и возвращает#
последовательность последовательных чисел в последовательности.Производит список всех таких прогонов до ввода
#
Flattens
результирующий список и возвращает#
th-й элемент.источник
Perl 5 , 33 + 1 (-p) = 34 байта
Попробуйте онлайн!
источник
Тампио ,
310308 байтИспользование:
4:n uni
оценивает в9
.Объяснение:
Из стандартной библиотеки:
источник
JavaScript (ES6), 33 байта
Рекурсивное решение, вдохновленное наблюдениями Ксандерхолла .
Попытайся
источник
Python 3 , 50 байт
Попробуйте онлайн!
источник
Mathematica, 82 байта
источник
Python , 40 байт
Попробуйте онлайн!
Оптимизация выражения Leaky Nun .
Python , 41 байт
Попробуйте онлайн!
Рекурсивное выражение.
источник
Javascript (ES6)
10098 байтВ некотором роде это было сделано быстро, так что держу пари, что есть много возможностей для улучшения, только основные циклы и счетчики.
источник
Сетчатка , 27 байт
Попробуйте онлайн! Порт ответа @ LeakyNun's Python. Первый и последний этапы - просто скучное десятичное число - одинарное преобразование. Второй этап работает следующим образом:
((^1|1\2)+)
это сопоставление треугольных чисел;$1
совпадающее треугольное число, в то время$2
как его индекс. Трейлинг1
означает, что он совпадает с наибольшим треугольным числом, строго меньшим, чем входное значение, что приводит к ровно на одну итерацию меньше, чем цикл Python, что означает, что$1
эквивалентноa-i
и$2
для,i-1
а их сумма равнаa-1
или~-a
требуется. ( чтобы соответствовать в этом случае тоже.$&
только препятствует тому, чтобы совпадение было удалено из результата.) Обратите внимание, что для входа1
не происходит совпадения, и выход просто совпадает с вводом. Если бы вы были извращены, вы могли бы использовать^((^1|1\2)*)1
источник
MATL , 12 байт
Попробуйте онлайн!
объяснение
источник
C (gcc) , 38 байт
Используя алгоритм @ Xanderhall здесь
Попробуйте онлайн!
источник
PHP,
48 4237 + 1 байтперенесено из ответа Лики Нун
Запустите как трубу с
-F
или попробуйте онлайн .прямой подход, 42 + 1 байт (перенесено из другого ответа Лики Нун )
Запустите как трубу с
-nR
или откомментируйте выше TiO.старое итеративное решение, 48 + 1 байт
источник