Вступление
Конечно, у нас много проблем с последовательностью , так что вот еще одна.
Последовательность Кимберлинга ( A007063 ) выглядит следующим образом:
1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28, 22, ...
Это получается путём перетасовки нормальной итерации:
[1] 2 3 4 5 6 7 8
Первый член последовательности 1
. После этого мы переставляем последовательность до тех пор, пока не будут использованы все термины слева. Тасование имеет шаблон right - left - right - left - ...
. Поскольку слева от термина нет терминов 1
, здесь нет тасования. Мы получаем следующее:
2 [3] 4 5 6 7 8 9
На i- й итерации мы отбрасываем i- й элемент и помещаем его в нашу последовательность. Это вторая итерация, поэтому мы отбрасываем второй пункт. Последовательность становится: 1, 3
. Для нашей следующей итерации мы будем перетасовывать текущую итерацию с шаблоном выше. Мы берем первый неиспользованный предмет справа от i- го предмета. Это случается 4
. Мы добавим это к нашей новой итерации:
4
Теперь мы возьмем первый неиспользованный предмет слева от i- го предмета. Это 2
. Мы добавим это к нашей новой итерации:
4 2
Поскольку слева от i- го элемента не осталось элементов, мы просто добавим остальную часть последовательности к новой итерации:
4 2 [5] 6 7 8 9 10 11 ...
Это наша третья итерация, поэтому мы отбросим третий пункт, который есть 5
. Это третий пункт в нашей последовательности:
1, 3, 5
Чтобы получить следующую итерацию, просто повторите процесс. Я сделал подарок, если не ясно:
GIF занял у меня больше времени, чем написание фактического поста
задача
- Если задано неотрицательное целое число n , выведите первые n членов последовательности
- Вы можете предоставить функцию или программу
- Это код-гольф , поэтому выигрывает представление с наименьшим количеством байтов!
Тестовые случаи:
Input: 4
Output: 1, 3, 5, 4
Input: 8
Output: 1, 3, 5, 4, 10, 7, 15, 8
Input: 15
Output: 1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28
Примечание: запятые в выводе не обязательны. Вы можете, например, использовать переводы строки, выводить список и т. Д.
Ответы:
Pyth, 22 байта
Попробуйте онлайн: демонстрация
Просто выполняет технику тасования, описанную в ОП.
Объяснение:
источник
Юлия,
7871 байтЭто безымянная функция, которая принимает целое число и возвращает массив целых чисел. Чтобы вызвать его, присвойте его переменной.
Подход здесь такой же, как описанный в OEIS.
Ungolfed:
Сохранено 7 байтов благодаря Mauris!
источник
Mathematica 130 байтов
Мы начинаем со списка, состоящего из диапазона от
1
до3x
, гдеx
находится желаемое количество членов последовательности Кимберлинга.На каждом шаге
n
,TakeDrop
разбивает текущий список на передний список2n+1
терминов (где выполнена работа) и задний лист (который позже будет объединен с переработанным передним списком). Передний список сопоставляется со следующим шаблоном,{t___,z,r___}
где z - член Кимберлинга в центре переднего списка.r
этоRiffle
«д с обратнойt
и затем задний лист прилагается.z
удаляется и добавляется к (AppendTo
) растущей последовательности Кимберлинга.n
увеличивается,1
и текущий список обрабатывается той же функцией черезNest.
пример
источник
Python 2, 76 байт
объяснение
Это формула OEIS после многих гольф-трансформаций! Это сработало красиво . Оригинальный код был
Я сначала избавился
i
, заменив егоa+1
везде и расширив выражения:Затем, переписал ,
b<2*a-1
как-~b<2*a
сохранить байты пробелов и переместил+1
в отбор, деление на 2, и отрицание:Тогда,
-b-1
просто~b
, чтобы мы могли написать(b,~b)[b%2]
. Это эквивалентно сb^0 if b%2 else b^-1
помощью оператора XOR, или в качестве альтернативы,b^b%-2
.источник
Pyth,
2925 байтЯкубе сохранил 4 байта, но я понятия не имею, как читать код больше.
Вот старое решение:
Перевод моего Python ответа. Я не очень хорош в Pyth, так что, возможно, есть еще способы сократить это.
источник
.W
для гольфа от 4 байта:VQ+.W<hHyN-~tN/x%Z_2Z2hNN
..W
имеет вид:.W<condition><apply><start-value>
. Я использовал начальное значениеhN
, как вы сделали вKhN
..W
изменяет это значение до тех пор, пока<condition>
оно истинно. Я использовал то же условие, что и вы<hHyN
. Условие является лямбда-функцией с параметромH
, поэтому текущее значение (в вашем кодеK
) равноH
. И я также использовал тот же<apply>
заявление , как вы, я только заменитьK
сZ
, потому что<apply>
утверждение лямбда-функции с параметромZ
. Мы можем игнорировать=K
,.W
обрабатывает это. Он заменяет старое значение на расчетное. В конце печать+...N
APL,
5644 байтаЭто неназванный монадический поезд, который принимает целое число справа и возвращает массив. Это примерно такой же подход, как и мой ответ Джулии .
Самая внутренняя функция - это рекурсивная диадическая функция, которая возвращает n- й член в последовательности Кимберлинга, заданный n в качестве идентичных левого и правого аргументов.
Имея это в виду, мы можем получить отдельные термины последовательности. Однако тогда возникает проблема, что это диадическая функция, то есть она требует аргументов с обеих сторон. Введите
⍨
оператора! Учитывая функциюf
и входx
, такf⍨x
же, какx f x
. Так что в нашем случае, ссылаясь на вышеупомянутую функцию какf
, мы можем построить следующую монадическую последовательность:Мы применяем
f
к каждому целому числу от 1 до ввода, получая массив.Сохранено 12 байтов благодаря Денису!
источник