Рассмотрим следующую последовательность:
0 1 3 2 5 4 8 6 7 12 9 10 11 17 13 14 15 16 23 ...
Выглядит довольно шаблонно, верно? Вот как это работает. Начиная с 0
, прыгайте вверх n
целые числа, n
начиная с 1
. Это следующий номер в последовательности. Затем добавьте все числа, «пропущенные», и которые еще не были показаны в порядке возрастания. Затем увеличивайте n
и переходите от последнего добавленного числа. Повторите этот шаблон.
Так, например, когда мы достигаем 11
, мы находимся n=5
. Мы увеличиваем, n
чтобы быть n=6
, подпрыгнуть 17
, затем добавить, 13 14 15 16
так как они еще не были замечены. Наш следующий переход - n=7
следующий элемент в последовательности 23
.
Соревнование
Задавая входные данные x
, x
выводим термы этой последовательности, первые x
термы последовательности или строим бесконечный список терминов последовательности. Вы можете выбрать 0- или 1-индексацию.
Ввод / вывод и правила
- Вход и выход могут быть заданы любым удобным способом .
- Можно предположить, что ввод и вывод соответствуют типу номера вашего языка.
- Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
- Стандартные лазейки запрещены.
- Это код-гольф, поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
Ответы:
JavaScript (ES7), 41 байт
Возвращает n-й член последовательности с 0 индексами.
Попробуйте онлайн!
Как?
Основной случай:n > 3
Первые четыре члена последовательности являются специальными, поэтому давайте отложим их пока.
Для последовательность выглядит так:n > 3
Мы можем заметить, что на самом деле есть две чередующиеся подпоследовательности:
Большинство значений принадлежат подпоследовательности для которой мы просто имеем:A
Некоторые другие значения принадлежат подпоследовательности (выделено скобками на диаграмме выше), индексы которой следуют арифметической последовательности 3, 3, 4, 6, 9, 13, 18, 24 ... и для которой мы имеем:В
где является индексом в основной последовательности , и к является индексом в суб-последовательности B .N К В
Индексы в основной последовательности определяются как:В
Учитывая , мы знаем, что соответствующий член в главной последовательности принадлежит B, если n является целочисленным решением квадратного уравнения:N B n
чей дискриминант является:
и чье положительное решение:
Мы ожидаем быть целым числом. Отсюда и тест:Δ−−√
Особые случаи:0≤n≤3
При дискриминант отрицателен, а получение его квадратного корня приводит к NaN . Для n = 3 дискриминант равен 1 . Таким образом, эти первые четыре члены последовательности считаются принадлежащими к подпоследовательности B .n<3 n=3 1 B
Если бы мы просто применили нашу стандартную формулу n - ~ d / 2 , мы получили бы:
вместо того:
Вот почему мы XOR эти результаты с соответственно.0,1,2 and 1
источник
Шелуха , 12 байт
Попробуйте онлайн!
Выходы в виде бесконечного списка. Вот версия , которая печатает первый N .
объяснение
источник
Haskell , 43 байта
Попробуйте онлайн!
Определяет бесконечный список:
источник
Желе , 15 байт
Это полная программа, которая, учитывая n , печатает первые n элементов последовательности.
Попробуйте онлайн!
Как это устроено
источник
C (gcc),
736764 байтаПопробуйте онлайн!
Определяет функцию,
f
которая принимает 0-индексированныйn
и производитn
th-е число в последовательности.Мы можем проанализировать последовательность следующим образом:
Сначала мы обращаемся к средней части:
Обратите внимание, что аргументы слева (4, 6, 9, 13, ...) следуют шаблону: сначала добавьте два, затем добавьте три, затем добавьте четыре и так далее. Мы начинаем с
t=4
и добавляемd
(который начинается с 2) каждую итерацию цикла, увеличиваясьd
в процессе.Тело цикла является более интересным. Помните, что мы хотим отобразить от 4 до 5, от 6 до 8, от 9 до 12 и т. Д .; это просто добавление,
d-1
еслиx
естьt
. Однако эта логика предшествует последнему случаю,f(n) = n - 1
поэтому мы знаем, что мы собираемся вычесть 1 в конце. Поэтому мы можем просто добавитьd
ifx == t
(x-t||(x+=d)
). Тем не менее, мы также должны выйти из цикла сразу же после этого - поэтому мы добавим , что кd
получить абсурдный видd+=x+=d
, который всегда сделаетd<x
состояние терпеть неудачу.Это охватывает все, кроме первых четырех значений. Глядя на них в двоичном виде, мы получаем:
Итак, мы хотим перевернуть последний бит, если
2 <= x < 4
. Это достигается сx^x/2
.x/2
дает второй младший значащий бит, так что XOR с этим исходным номером переворачивает последний бит, если число равно 2 или 3.источник
Желе ,
1310 байт-3 Благодаря Деннису (используйте 0-индексирование, чтобы сохранить 2 от настройки накопленной суммы и окончательного уменьшения)
Монадическая ссылка, принимающая целое, 0 -индексированное n , которое возвращает целое число a (n)
Попробуйте онлайн! Или посмотрите тестовый набор
источник
ḶÄ+3i+’
, но понятия не имел, как обращаться с крайними случаями.Ḷ»ạ¥3
дляḊ3,2;
- чувство, что должно быть terser для этого бита.Ḷ»2Äi+_>2$
сохраняет 3 байта с индексированием на основе 0.Perl 5 с
-pl
, 70 байтПопробуйте онлайн!
источник
MATL , 22 байта
Выводит первые
n
члены последовательности.Попробуйте онлайн!
объяснение
источник
Haskell , 51 байт
Попробуйте онлайн!
Немного дольше, чем ответ Линн на Хаскелл , но другой подход может быть интересным, тем не менее.
источник
Рубин , 73 байта
Попробуйте онлайн!
Рекурсивная функция, которая возвращает первые x чисел в списке.
источник
QBasic, 58 байт
Выходы на неопределенный срок. Вы можете добавить
SLEEP 1
внутри цикла или сделать егоLOOP WHILE b<100
или что-то в этом роде, чтобы увидеть результаты.Это в основном просто реализует спецификацию. Заметьте, что числа, к которым мы возвращаемся, всегда будут числами между последним числом перехода и числом перехода до этого. Поэтому мы сохраняем эти границы как
a
иb
и используемFOR
цикл для печати всех чисел между ними.источник
05AB1E , 14 байтов
Попробуйте онлайн!
источник
R 70 байт
Попробуйте онлайн!
F
константы благодаря предложению @JADsetdiff
вместоx[x %in% y]
Предыдущая версия (79 байт)
источник
5 bytes
и вызывает кучу предупреждений!F/T
не переопределено при определении функции. Это не (IIRC) изменяет глобальное значение дляF/T
Python 2 , 123 байта
Попробуйте онлайн!
При заданном вводе x выведите первые x членов последовательности,
Я изучаю Python, и эти проблемы делают вещи более интересными.
Изменить: побрить пробел
источник
for n in range(1,z) if len(s) < z]; return s
:for n in range(1,z)if len(s)<z];return s
.Желе , 16 байт
Попробуйте онлайн!
Один байт длиннее, чем существующий ответ Jelly, но это может быть немного в гольфе.
RÄṬŻk²Ḋ$
может быть короче.18 байт
Дольше, но разные.
источник
Рубин , 63 байта
Попробуйте онлайн!
0 индексированные. Может быть, можно играть в гольф.
источник
Perl 6 , 52 байта
Попробуйте онлайн!
Это выражение генератора с использованием
...
оператора. Он ищет пробелы в предыдущей последовательности@_
через((^max @_)∖@_).min.?key
:?
Необходимо для начального значения , которое не имеет.key
. Если пропуски не найдены, то это добавляет n (здесь в$
переменной) к последнему значению в списке, плюс один для отключения на 0 ошибок.источник
Python 3 , 104 байта
Попробуйте онлайн!
Учитывая ввод x, выведите первые x «последовательностей»
источник