Створення послідовності Давенпорт-Шінзель


11

Фон

Послідовність Давенпорта-Шінзеля має два цілих параметри dі n. Позначимо набір усіх послідовностей Давенпорта-Шінзеля для заданих параметрів через DS(d,n).

Розглянемо всі послідовності натуральних чисел 1до nвключно, які задовольняють:

  • Немає двох послідовних чисел у послідовності однакові.
  • Немає жодної послідовності (не обов'язково послідовної) довжини, більшої ніж d, яка чергується між двома різними числами.

Нехай Lпозначають максимальну довжину такої послідовності (задано dі n). Потім, DS(d,n)це множина всіх таких послідовностей з довжиною L.

Деякі приклади можуть допомогти. Нехай d = 4, n = 3. Найдовші можливі послідовності з цими обмеженнями L = 8. Отже, учасник DS(4,3):

[1, 2, 1, 3, 1, 3, 2, 3]

Немає послідовних однакових чисел і є чергування послідовностей за довжиною 4, але не довші:

 1  2  1           2
 1  2        1     2
 1        3  1  3
 1        3  1        3
    2     3        2  3
    2           3  2  3
       1  3  1  3
       1  3  1        3

Наступні приклади НЕ в DS(4,3):

[1, 2, 2, 3, 1, 3, 2, 3]  # Two consecutive 2's.
[1, 2, 1, 3, 1, 3, 2, 1]  # Contains alternating subsequences of length 5.
[1, 2, 1, 3, 1, 3, 2]     # Longer valid sequences for d = 4, n = 3 exist.

Для отримання додаткової інформації див. MathWorld та OEIS та посилання на них.

Змагання

Дано два натуральних числа nі dгенерують будь-яку послідовність Давенпорта-Шінзеля в DS(d,n). Зауважте, що вони, як правило, не унікальні, тому виведіть будь-який дійсний результат.

Ви можете написати програму або функцію, взявши введення через STDIN (або найближчу альтернативу), аргумент командного рядка або аргумент функції та повернувши результат від функції або роздрукувавши її до STDOUT (або найближчої альтернативи).

Ви можете використовувати будь-який зручний, однозначний формат рядка або списку для виводу.

Це код гольфу, тому виграє найкоротше подання (у байтах).

Послідовність довжин

Оскільки послідовності не є унікальними, то в цьому виклику не багато користі для окремих прикладів. Однак дві загальні проблеми дійсності досить легко перевірити на наявність результатів, тому головне питання полягає лише в тому, чи має послідовність потрібну довжину (чи існує довша дійсна послідовність). Тому, ось список відомих 1 L для дали dі n:

 \ 
 d\n 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
   \-----------------------------------------------------------
 1 | 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 2 | 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
 3 | 1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
 4 | 1  4  8 12 17 22 27 32 37 42 47 53 58 64 69 75 81 86 92 98
 5 | 1  5 10 16 22 29 ...
 6 | 1  6 14 23 34 ...
 7 | 1  7 16 28 41 ...
 8 | 1  8 20 35 53 ...
 9 | 1  9 22 40 61 ...
10 | 1 10 26 47 73 ...

Ви не повинні жорстко кодувати будь-яку інформацію з цієї таблиці у вашій поданні.

1 Ця таблиця з 1994 року, тому, можливо, з цього часу було досягнуто більшого прогресу, але я сумніваюся, що будь-яке подання зможе обробити навіть більші записи в цій таблиці за розумну кількість часу.

Відповіді:


2

Пітон 2: 172

from itertools import*
d,n=input();S=[[1]]
for s in S:
 for v in range(1,n+1):
  if(v!=s[-1])*all(w[2:]!=w[:-2]for w in combinations(s+[v],d+1)):S.append(s+[v])
print S[-1]

Введення просто у форматі 4, 3.

Я ітераційно створюю всі послідовності, які починаються з 1двох властивостей і задовольняють їх, і зберігаю їх S. Оскільки я створюю їх у відсортованому порядку (відсортовано за довжиною [та за значеннями]), останній запис повинен бути послідовністю Давенпорт-Шінзель. Використовує приємний факт, що ви можете перебирати список, додаючи до нього.


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