Колакоскі, як самопосилаючі послідовності


19

Ось так визначається послідовність Колакоскі (OEIS A000002 ):

Послідовність Колакоскі - це послідовність, яка містить 1і 2, а nй елемент послідовності - це довжина третьої nгрупи рівних елементів (запуску) у самій послідовності. Першими 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- Й елемент повинен бути , як довго 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]

пісочниця (2k + користувачів)
Erik the Outgolfer


@MartinEnder думав, що я вже пов’язав це
Ерік Атголфер

Відповіді:


9

Лушпиння , 8 байт

Ṡωȯ↑⁰`Ṙ¢

Бере спочатку довжину, потім список. Спробуйте в Інтернеті!

Пояснення

Ṡωȯ↑⁰`Ṙ¢  Inputs: n=9 and x=[2,1,3]
Ṡωȯ       Apply the following function to x until a fixed point is reached:
           Argument is a list, say y=[2,2,1,3,3,3]
       ¢   Cycle x: [2,1,3,2,1,3..
     `Ṙ    Replicate to lengths in y: [2,2,1,1,3,2,2,2,1,1,1,3,3,3]
   ↑⁰      Take first n elements: [2,2,1,1,3,2,2,2,1]
          Final result is [2,2,1,1,3,2,1,1,1], print implicitly.

8

Піт, 14 байт

u<s*V]M*QlGGvz

Спробуйте в Інтернеті: Демонстраційний або Тестовий набір

Пояснення:

u                 start with G = input array
       *QlG       repeat input array
     ]M           put every element into its own list
   *V      G      repeat every list vectorized by the counts in G
  s               flatten
 <          vz    take the first (second input line) numbers
                  and assign them to G until you reach fixed point

Цікава альтернатива:u&VSvzs*V]M*Ql
Jakube

1
Це приємний підхід.
Erik the Outgolfer

5

Java 8, 151 + 19 119 115 байт

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;}

Спробуйте в Інтернеті!


1
Ви можете зменшити чотири байти, позбувшись два дужки, зміни &&до &і видалення коми: 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 байт )
Кевін Cruijssen

Запропонуйте (c==i?a:l)[i] замістьc==i?a[i]:l[i]
roofcat

5

R , 120 114 108 байт

-6 байт завдяки планнапусу

function(A,N){i=inverse.rle
w=length
a=rle(A)
while(w(a$l)<N){a[[1]]=i(a)
a[[2]]=rep(A,l=w(a$l))}
i(a)[0:N]}

Спробуйте в Інтернеті!

Анонімна функція; послідовно інвертує RLE, замінюючи довжини a[[1]]з перевернутої RLE, а значення a[[2]]з Aреплицируются на довжину , рівні a$l.


@plannapus ах, правильно! Я спробував це і розбив R, тому що при призначенні він створить, a$lі a$vякщо вони не існують, але вони не вплинуть на виклик inverse.rle, викликаючи нескінченний цикл. Я думаю, що я можу використовувати лише a$lу whileстані та repстані.
Джузеппе

5

Хаскелл , 68 байт

Велике спасибі Лайконі та недоліку за допомогу в налагодженні та гольфі за цю відповідь у чаті PPCG Haskell, Of Monads and Men . Пропозиції з гольфу вітаються! Спробуйте в Інтернеті!

(.f).take
f a@(z:_)=(z<$[1..z])++do i<-[1..];cycle a!!i<$[1..f a!!i]

Перший рядок - анонімна функція. Другий рядок - це нескінченне осмислення списку, яке виробляє нашу послідовність Колакоскі.

Пояснення

По-перше, ми визначаємо zяк голову aсa@(z:_) . Потім ініціалізуємо послідовність з (z<$[1..z]).

Потім, 1далі, do i<-[1..]ми додаємо до послідовності наступне:, cycle a!!i<$[1..f a!!i]що є i-м членом a(циклічно необмеженим), доданимf a!!i разів.

Нарешті, анонімна функція просто приймає перші nумови нашої послідовності, що нагадує Коласкоскі.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.