Вот как определяется последовательность Колакоски (OEIS A000002 ):
Последовательность Колакоски представляет собой последовательность, которая содержит
1
и2
, аn
th-й элемент последовательности является длинойn
th-й группы равных элементов (прогона) в самой последовательности. Первые 20 членов последовательности и соответствующие длины:1 2 2 1 1 2 1 2 2 1 2 2 1 1 2 1 1 2 2 1 - --- --- - - --- - --- --- - --- --- - 1 2 2 1 1 2 1 2 2 1 2 2 1
По сути, длинами групп равных элементов последовательности Колакоски является сама последовательность Колакоски.
Пока все хорошо, но почему мы должны ограничивать себя 1
и 2
? Мы не собираемся! При наличии двух входных данных, массива натуральных чисел A
и целого числа N
, возвращаются первые N
члены последовательности, подобной Колакоски, определенной циклически A
. Чтобы лучше понять это, вот рабочий пример с длинами вновь добавленных групп в скобках:
A = [2, 3, 1]
N = 25
2: [[2], 2 ]
3: [ 2 ,[2], 3 , 3 ]
1: [ 2 , 2 ,[3], 3 , 1 , 1 , 1 ]
2: [ 2 , 2 , 3 ,[3], 1 , 1 , 1 , 2 , 2 , 2 ]
3: [ 2 , 2 , 3 , 3 ,[1], 1 , 1 , 2 , 2 , 2 , 3 ]
1: [ 2 , 2 , 3 , 3 , 1 ,[1], 1 , 2 , 2 , 2 , 3 , 1 ]
2: [ 2 , 2 , 3 , 3 , 1 , 1 ,[1], 2 , 2 , 2 , 3 , 1 , 2 ]
3: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 ,[2], 2 , 2 , 3 , 1 , 2 , 3 , 3 ]
1: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 ,[2], 2 , 3 , 1 , 2 , 3 , 3 , 1 , 1 ]
2: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 ,[2], 3 , 1 , 2 , 3 , 3 , 1 , 1 , 2 , 2 ]
3: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 ,[3], 1 , 2 , 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 ]
1: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 , 3 ,[1], 2 , 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 1 ]
2: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 1 ,[2], 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 1 , 2 , 2 ]
C: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 1 , 2 , 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 1 , 2 , 2 ]
Вот еще один проработанный пример с ведущим 1
:
A = [1, 2, 3]
N = 10
1: [[1]]
2: [ 1 ,[2], 2 ]
3: [ 1 , 2 ,[2], 3 , 3 ]
1: [ 1 , 2 , 2 ,[3], 3 , 1 , 1 , 1 ]
2: [ 1 , 2 , 2 , 3 ,[3], 1 , 1 , 1 , 2 , 2 , 2 ]
C: [ 1 , 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 ]
Как вы можете видеть выше, окончательный результат был разрезан на N = 10
элементы. Элемент n
th должен указывать длину группы n
равных элементов, даже если сам элемент принадлежит к той группе, к которой он относится. Как и в приведенном выше случае, первая 1
относится к первой такой группе, которая является именно этим 1
, а первая 2
относится ко второй такой группе, которая начинается с нее.
правила
- Вы можете предположить, что
A
никогда не будет иметь два или более последовательных равных элемента.A
может содержать целое число более одного раза, но первый и последний элементы не будут равны иA
будут содержать как минимум 2 элемента (например[1, 2, 2, 3]
,[2, 4, 3, 1, 2]
и[3]
не будут даны). Это потому, что если бы были последовательные равные элементы, конечный результат был бы недопустимым префиксом для такой последовательности. - Вы можете предположить, что
A
содержит только положительные целые числа (так как в противном случае последовательность была бы неопределенной). - Вы можете предположить,
N
что это неотрицательное целое число (N >= 0
). - Вы не можете вернуть больше условий, чем запрошено.
- Использование любой из стандартных лазеек строго запрещено.
- Вы можете использовать любой разумный метод ввода / вывода .
- Ваш ответ не должен работать за пределами естественного языка, но теоретически ваш алгоритм должен работать для произвольно больших входных данных и целых чисел .
- Это код-гольф , поэтому выигрывает самый короткий ответ.
Контрольные примеры
[5, 1, 2], 0 -> []
[2, 3, 1], 25 -> [2, 2, 3, 3, 1, 1, 1, 2, 2, 2, 3, 1, 2, 3, 3, 1, 1, 2, 2, 3, 3, 3, 1, 2, 2]
[1, 2, 3], 10 -> [1, 2, 2, 3, 3, 1, 1, 1, 2, 2]
[1, 2], 20 -> [1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1]
[1, 3], 20 -> [1, 3, 3, 3, 1, 1, 1, 3, 3, 3, 1, 3, 1, 3, 3, 3, 1, 1, 1, 3]
[2, 3], 50 -> [2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 2, 3, 3]
[7, 4], 99 -> [7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4]
[1, 2, 3], 5 -> [1, 2, 2, 3, 3]
[2, 1, 3, 1], 2 -> [2, 2]
[1, 3, 5], 2 -> [1, 3]
[2, 3, 2, 4], 10 -> [2, 2, 3, 3, 2, 2, 2, 4, 4, 4]
источник
Ответы:
Шелуха , 8 байт
Принимает сначала длину, затем список. Попробуйте онлайн!
объяснение
источник
Pyth, 14 байт
Попробуйте онлайн: демонстрация или тестовый набор
Объяснение:
источник
u&VSvzs*V]M*Ql
Java 8,
151 + 19119115 байтПопробуйте онлайн!
источник
&&
к&
и удалению запятой:a->n->{int c=0,l[]=new int[n],i=0,j;for(;i<n;i++)for(j=0;j<(c==i?a[i]:l[i])&c<n;j++)l[c++]=a[i%a.length];return l;}
( 115 байт )(c==i?a:l)[i]
вместоc==i?a[i]:l[i]
R ,
120114108 байт-6 байт благодаря планнапу
Попробуйте онлайн!
Анонимная функция; последовательно инвертирует RLE, заменяя длины
a[[1]]
с перевернутой RLE, а значенияa[[2]]
сA
реплицируются на длину , равныеa$l
.источник
a$l
иa$v
если они не существуют, но они не будут влиять на вызовinverse.rle
, вызывая бесконечный цикл. Я думаю, что я могу использовать толькоa$l
вwhile
состоянии иrep
состоянии.Haskell , 68 байт
Большое спасибо Лайкони и Flawr за их помощь в отладке и игре в гольф этот ответ в чате PPCG Haskell, Of Monads and Men . Предложения по игре в гольф приветствуются! Попробуйте онлайн!
Первая строка - анонимная функция. Вторая строка - это представление о бесконечном списке, которое порождает нашу последовательность в стиле Колакоски.
объяснение
Во-первых, мы определяем
z
как главаa
сa@(z:_)
. Затем мы инициализируем последовательность с помощью(z<$[1..z])
.Затем, начиная с этого
1
момента,do i<-[1..]
мы добавляем следующее к последовательности:,cycle a!!i<$[1..f a!!i]
которая являетсяi
-ым членомa
(циклически неопределенного) добавленногоf a!!i
времени.Наконец, анонимная функция просто берет первые
n
члены нашей последовательности, подобной Коласкоски.источник
Python 2 , 123 байта
Попробуйте онлайн!
источник